1.主要理解一点,里面的scope属性就先保存了所有父级环境的AO对象,这个scope属性是静态的,除非函数被销毁,否则从函数创建时就已经存在。
2.函数在每次运行时会重新创建函数内所有定义的变量,函数其实也是一种变量,因为它是变量名指向一个函数方法,所有的变量创建后加入到自身AO对象中,然后将在scope属性中加入自身AO对象。
3.有一个特例,
var x = 10;
function foo() {
var y = 20;
function barFD() { // 函数声明
alert(x);
alert(y);
}
var barFE = function () { // 函数表达式
alert(x);
alert(y);
};
var barFn = Function('alert(x); alert(y);');
barFD(); // 10, 20
barFE(); // 10, 20
barFn(); // 10, "y" is not defined
}
foo();
我们看到,通过函数构造函数(Function constructor)创建的函数“bar”,是不能访问变量“y”的。但这并不意味着函数“barFn”没有[[scope]]属性(否则它不能访问到变量“x”)。
问题在于通过函构造函数创建的函数的[[scope]]属性总是唯一的全局对象
。考虑到这一点,如通过这种函数创建除全局之外的最上层的上下文闭包是不可能的。
本文深入理解思路来源于:http://www.cnblogs.com/TomXu/archive/2012/01/18/2312463.html