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的说法是我在其他文章上看到的,我其实认为应该为一个链表的一个节点。