美文网首页
闭包的作用域链

闭包的作用域链

作者: pengtoxen | 来源:发表于2019-05-15 15:44 被阅读0次

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

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



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

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

    相关文章

      网友评论

          本文标题:闭包的作用域链

          本文链接:https://www.haomeiwen.com/subject/kispaqtx.html