疏理js执行细节

来源:互联网 发布:毛笔字软件哪个好 编辑:程序博客网 时间:2024/05/20 23:56

1.概念介绍

执行环境(context)
也称执行上下文,执行环境分为全局执行环境和函数执行环境。全局执行环境在全局代码开始执行的时侯会被创建,函数执行环境在函数执行时会被创建。

变量对象(variableObject)
每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。在函数上下文情况下,参数列表也会被加入到变量对象中。

活动对象(activationObject)
当函数被激活时,那么一个活动对象就会被创建并且分配给执行上下文。活动对象最初由特殊对象arguments初始化而成,包含了所有局部变量,命名参数,参数集合以及this,最后作为函数运行时的变量对象用于变量初始化。

作用域([[Scope]])
每个函数都有一个内部属性[[Scope]],包含了一个函数被创建的作用域中对象的集合,即该函数的父级环境的作用域链。在函数被创建的时候就已经被确定(即静态作用域特性)。

作用域链(scope chain)
每个执行环境都有自己的作用域链,用于解析标识符。每个执行环境的作用域链由当前函数的变量对象及父级环境的作用域链构成。当一个函数被创建时,他的作用域链初始化为当前运行函数的[[Scope]]属性中的对象。随后,当前函数的变量对象被推入作用域链的最前端。

环境栈(contextStack)
JS引擎在进入一段可执行的代码时,首先,创建一个全局对象(Global Object) , 这个对象全局只存在一份,它的属性在任何地方都可以访问,它的存在伴随着应用程序的整个生命周期。然后,JS引擎需要构建执行环境栈 ,与此同时,也要创建一个全局执行环境,并将这个全局执行环境压入执行环境栈中。执行环境栈的作用是为了保证程序能够按照正确的顺序被执行。在javascript中,每个函数都有自己的执行环境,当执行一个函数时,该函数的执行环境就会被推入执行环境栈的顶部并获取执行权。当这个函数执行完毕,它的执行环境又从这个栈的顶部被删除,并把执行权并还给之前执行环境。

2.代码实例

var a=3;function add(num){    var b=2;    return a+b+num;}add(5);

1.进入全局执行环境,全局环境被压入环境栈

contextStack=[globalContext]

2.全局上下文环境初始化,

globalContext={    variable object:[a,add],    scope chain:variable object}

同时add函数被创建,add函数的作用域被确定下来

add.[[Scope]]=globalContext.scopeChain

3.执行add函数,add函数的执行环境会被创建,add环境被推入环境栈,add的上下文被初始化。

contextStack=[addContext,globalContext];addContext={    scopeChain:[add.[[Scope]]]}

4.add的活动对象被创建,此时add.activationObject=[arguments,b]

5.add的活动对象被当作变量对象用于初始化。
随后变量对象被压入add的作用域链前端

add.variableObject=add.activationObject=[arguments,b],addContext.scopeChain=[add.variableObject,add.[[Scope]]]

6.add函数执行完毕,add的上下文从环境栈中弹出,add环境被销毁。

contextStack=[globleContext]

Ps:参考文章:http://www.cnblogs.com/onepixel/p/5090799.html

0 0