在JS里面:[[scope]]指的就是作用域,其中存储了运行期上下文的集合;
而作用域链是指:[[scope]]中所存储的执行期上下文对象的集合,这个集合呈链式链接
执行期上下文:当函数执行时,会创建一个称为执行期上下文的内部对象。一个执行期上下文定义了一个函数
下面上代码
function a() {
function b() {
var b = 999;
console.log(b);//这里b是999
}
var a = 123;
b();
console.log(a);//所以这里是123
//console.log(b);//这里是a函数执行 打印b是函数体function b() {
// var b = 999;
// }
}
var glob = 100;
a();
// a defined a.[[scope]] 0:GO{a:function() {},glob:100}
// a doing a.[[scope]] 0:AO{a:123,b:function() {}} a的AO
// 1:GO{a:function() {},glob:100}
// b defined b.[[scope]] 0:AO{a:123,b:function() {}} a的AO
// 1:GO{a:function() {},glob:100}
// b doing b.[[scope]] 0:AO{b:999} b的AO
// 1:AO{a:123,b:function() {}}
// 2:GO{a:function() {},glob:100}
function a() {
function b() {
var b = 999;
a = 10;
console.log(b);//这里b是999
}
var a = 123;
b();
console.log(a);//这里a是10
}
var glob = 100;
a();
从上述代码可以看到在b函数执行完后,访问a,拿的就是a的AO(引用),在b执行后,a的值已经被改变成了10