闭包的作用域链

我们知道,闭包可以访问外部作用域的变量,那是怎么访问的呢?

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).但在作用域链中,外部函数的活动对象始终处于第二位,外部函数的外部函数的活动对象处于第三位,一直到全局执行环境.



上图清晰的描述了匿名函数和各个作用域的关系.函数都是以堆栈的形式调用,结合上图和自己的理解,整理如下:

函数执行的时候是入栈,执行完后是出栈,这么一个过程.在书中我没有找到执行环境是如何找到上一级执行环境的描述,这里我暂时写成通过指针来查找.

你可能感兴趣的:(闭包的作用域链)