Home  >  Q&A  >  body text

javascript - 请教作用域和作用域链

查了一晚上的资料,勉强理解了执行上下文,变量对象,活动对象。但是作用域和作用域链还是没捋顺。网上相关的资料觉得也都不太严谨。
请问作用域和作用域链是一回事吗?(应该不是一回事是吧,请问有没有规范严谨的定义?)
知乎上看到:

函数作用域链 = (动)活动对象(AO) + (静)scope属性

作用域是定义时确定的,那是就等于scope属性吗?作用域链的话,每次调用时(仅)因活动对象不同而不同,是这样吗?作用域链到底是动态的还是静态的?
请大神指教~

怪我咯怪我咯2772 days ago724

reply all(2)I'll reply

  • 阿神

    阿神2017-04-11 13:18:39

    我的理解如下:

    1. 作用域是一个范围.举个简单栗子:比如说声明一个函数A,那么A函数大括号内就形成一个作用域,用来保护A里边的变量;再声明一个函数B,它也会形成一个作用域;作用域里边可以访问到外边的变量,但是作用域外边的不能访问到里边的变量;

    2. 作用域链是一串作用域.函数A里边嵌套一个函数B,B里边嵌套一个C;如果定义一个全局变量num,它在ABC里边都有用到;那么,它作用时的作用域链就是 A -> B -> C ;就像一个大的盒子,装了一个中等盒子,中盒子再装了一个小盒子.

    reply
    0
  • PHP中文网

    PHP中文网2017-04-11 13:18:39

    我不是大神,可能说的有误~还望谅解啊(●'◡'●)

    作用域确实是在函数定义时就已经确定的,它就表示一个范围。

    var outer = 1; //全局作用域
    function foo(x) { //foo作用域
        var inner = 2;
        function bar(x) { //bar作用域
            var deeper = 3;
        }
        bar(1);
        bar(2);
    }
    
    foo(1);

    你说的"每次调用时(仅)因活动对象不同而不同"应该说的是执行上下文环境。比如代码中的bar(1)和bar(2)调用执行时,bar作用域中上下文环境:首先执行bar(1)上下文环境是x=1,deeper=3,然后执行到bar(2)时,销毁bar(1)的那个上下文环境,新的上下文环境变成了x=2,deeper=3。

    作用域链只是寻找变量的一条路线。在当前作用域中寻找不到需要的变量时,比如bar()想要找到outer,但是bar()作用域中不存在outer变量,接着要到创建这个函数的那个作用域中取值即foo作用域寻找,找不到继续往上寻找。

    reply
    0
  • Cancelreply