Rumah > Soal Jawab > teks badan
查了一晚上的资料,勉强理解了执行上下文,变量对象,活动对象。但是作用域和作用域链还是没捋顺。网上相关的资料觉得也都不太严谨。
请问作用域和作用域链是一回事吗?(应该不是一回事是吧,请问有没有规范严谨的定义?)
知乎上看到:
函数作用域链 = (动)活动对象(AO) + (静)scope属性
作用域是定义时确定的,那是就等于scope属性吗?作用域链的话,每次调用时(仅)因活动对象不同而不同,是这样吗?作用域链到底是动态的还是静态的?
请大神指教~
阿神2017-04-11 13:18:39
我的理解如下:
作用域是一个范围.举个简单栗子:比如说声明一个函数A,那么A函数大括号内就形成一个作用域,用来保护A里边的变量;再声明一个函数B,它也会形成一个作用域;作用域里边可以访问到外边的变量,但是作用域外边的不能访问到里边的变量;
作用域链是一串作用域.函数A里边嵌套一个函数B,B里边嵌套一个C;如果定义一个全局变量num,它在ABC里边都有用到;那么,它作用时的作用域链就是 A -> B -> C ;就像一个大的盒子,装了一个中等盒子,中盒子再装了一个小盒子.
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作用域寻找,找不到继续往上寻找。