[[scope]]:每个JavaScript函数都是一个对象,对象中有些属性我们可以访问,但有些不可以,这些属性仅供JavaScript引擎存取,[[scope]]就是其中一个。
[[scope]]指的是我们常说的作用域,其中存储了运行期上下文的集合。
作用域链:[[scope]]中所储存的执行期上下文对象的集合,这个集合呈链式链接,我们叫它为作用域链。
function a() {
var aa = 1
console.log(aa)
console.log(bb) //报错
function b() {
var bb = 2
console.log(aa, bb)
console.log(cc) //报错
function c() {
var cc = 3
console.log(aa, bb, cc) //正常
}
c()
}
b()
}
a()
a函数[[scope]]执行期上下文对象的链式集合:变量aa,b函数->全局环境。
b函数[[scope]]执行期上下文对象的链式集合:b函数,变量bb,c函数->变量aa,a函数->全局环境。
c函数[[scope]]执行期上下文对象的链式集合:变量cc->b函数,变量bb,c函数->变量aa,a函数->全局环境。
查找变量遵循从作用域链的顶端依次向下查找的原则。所以在所在的作用域链查找不了该变量会报错。