js执行环境深入研究

js 声明函数是创建函数对象的过程,当创建函数对象时,函数对象的[[scope]] =连当前执行环境对象的作用域(栈顶执行环境--当执行函数时,js会将该函数的执行环境对象入栈)

 

当为全局函数时,如:

function A(){
}

A.[[scoope]]=[table]只包含全局对象。

当我们在A中再声明函数时,如:

functionA(){

     functionB(){
     }

}

A();

当A(); 执行时,会首先创建一个活动对象,我们设它为o,js会为o创建一个argsments属性,该属性指向一个对象,该对象包含A的实参,这里为空。

在A()之前,函数对象A的[scope]为包含全局对象的table,当A()执行时,o.[scope]=A.[scope]+o;然后继续变量实例化。

1.每一个定义在函数签名中的参数定义一个属性,如果在前面已经创建的arguments对象中对应的位置有一个值,这个值被分配给该属性,否则,该属性值为undefined。

2.扫描函数体检测其中声明的函数,这里为B。创建B函数,B.[scope]=o.[scope];

3.扫描函数体检测其中var声明的变量,将var 声明的变量设为o的对应属性,并设为undefined。

4.this”属性被创建,它的值依赖于函数的访问方式。

5.函数体执行。

 

注:上文中的“[scope]为包含全局对象的table” table的说法是我在其他文章上看到的,我其实认为应该为一个链表的一个节点。

 

 

 

 

 

 

posted @ 2014-02-25 22:03  云上青天  阅读(1043)  评论(0编辑  收藏  举报