84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
查了一晚上的资料,勉强理解了执行上下文,变量对象,活动对象。但是作用域和作用域链还是没捋顺。网上相关的资料觉得也都不太严谨。请问作用域和作用域链是一回事吗?(应该不是一回事是吧,请问有没有规范严谨的定义?)知乎上看到:
函数作用域链 = (动)活动对象(AO) + (静)scope属性
作用域是定义时确定的,那是就等于scope属性吗?作用域链的话,每次调用时(仅)因活动对象不同而不同,是这样吗?作用域链到底是动态的还是静态的?请大神指教~
走同样的路,发现不同的人生
我的理解如下:
作用域是一个范围.举个简单栗子:比如说声明一个函数A,那么A函数大括号内就形成一个作用域,用来保护A里边的变量;再声明一个函数B,它也会形成一个作用域;作用域里边可以访问到外边的变量,但是作用域外边的不能访问到里边的变量;
作用域链是一串作用域.函数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作用域寻找,找不到继续往上寻找。
创建这个函数的那个作用域中取值
我的理解如下:
作用域是一个范围.举个简单栗子:比如说声明一个函数A,那么A函数大括号内就形成一个作用域,用来保护A里边的变量;再声明一个函数B,它也会形成一个作用域;作用域里边可以访问到外边的变量,但是作用域外边的不能访问到里边的变量;
作用域链是一串作用域.函数A里边嵌套一个函数B,B里边嵌套一个C;如果定义一个全局变量num,它在ABC里边都有用到;那么,它作用时的作用域链就是 A -> B -> C ;就像一个大的盒子,装了一个中等盒子,中盒子再装了一个小盒子.
我不是大神,可能说的有误~还望谅解啊(●'◡'●)
作用域确实是在函数定义时就已经确定的,它就表示一个范围。
你说的"每次调用时(仅)因活动对象不同而不同"应该说的是执行上下文环境。比如代码中的bar(1)和bar(2)调用执行时,bar作用域中上下文环境:首先执行bar(1)上下文环境是x=1,deeper=3,然后执行到bar(2)时,销毁bar(1)的那个上下文环境,新的上下文环境变成了x=2,deeper=3。
作用域链只是寻找变量的一条路线。在当前作用域中寻找不到需要的变量时,比如bar()想要找到outer,但是bar()作用域中不存在outer变量,接着要到
创建这个函数的那个作用域中取值
即foo作用域寻找,找不到继续往上寻找。