我们知道,闭包可以访问外部作用域的变量,那是怎么访问的呢?
function createComparisonFunction(propertyName) {
return function (object1, object2) {
var value1 = object1[propertyName];
var value2 = object2[propertyName];
if (value1 < value2) {
return -1;
} else if (value1 > value2) {
return 1;
} else {
return 0;
}
};
}
//创建函数
var compareNames = createComparisonFunction("name");
//调用函数
var result = compareNames({ name: "Nicholas" }, { name: "Greg" });
//解除对匿名函数的引用(以便释放内存)
compareNames = null;
上面是书中的例子,书中写到当某个函数被调用时,会创建一个执行环境(execution context)及相应的作用域链.然后arguments和其他命名参数的值来初始化函数的活动对象(activation object).但在作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象处于第三位,一直到全局执行环境.
上图清晰的描述了匿名函数和各个作用域的关系.函数都是以堆栈的形式调用,结合上图和自己的理解,整理如下:
函数执行的时候是入栈,执行完后是出栈,这么一个过程.在书中我没有找到执行环境是如何找到上一级执行环境的描述,这里我暂时写成通过指针来查找.
网友评论