请教作用域和作用域链

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

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

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


谢谢二位解答,但是你们说的这些都是我已经明白的部分,最后看了别人的系列文章才大概捋顺了。还要继续学习!

阅读 2.6k
4 个回答

我的理解如下:

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

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

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

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

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作用域寻找,找不到继续往上寻找。

推荐问题
宣传栏