作用域:
[[scope]]
每一个JavaScript函数都是一个对象,有些对象我们是可以访问的,但是有一些, 我们访问不了,访问不了的那部分一般是给JavaScript引擎存取的。[[scope]]指的就是我们所说的作用域,其中存储了运行期上下文的集合。
作用域链
[[scope]]中存储的执行器上下文对象的集合,这种集合呈链式连接,称之为作用域链,
执行期上下文(GO AO)
当函数在执行前会进行预编译,预编译也就是就可以成为执行期上下文,每一个执行期上下文都是独一无二的,多次调用一盒函数会导致创建多个执行期上下文,当函数执行完毕,执行期上下文就会被销毁,也就是说,执行期上下文是临时文件.,函数执行完了,他就没了.
注意点
AO在作用域链的顶端
查找变量
查找变量的时候,会从作用域链的顶端依次向下查找,如果在函数体里面开始找的话,会先在当前的函数体里开始寻找,也就是 AO ,然后再查找 GO .
通俗说法
函数作用域就是等于 一个小镇子里面,有好多好多的小房子,每一个小房子都是独立的。
作用域链等于是 你爷爷的儿子是你爸爸你爸爸的儿子是你,你可以去问你爸爸要钱,你可以去问你爷爷要钱,但是你爸爸不能问你要钱,你爷爷更加不可能问你要钱,在函数中,被包含在最里面的那个函数权限是最大的,越往外面,权限越小,越往里面,权限越大。
function a(){
function b(){
function c (){
}
c();
}
b();
}
a();
作用域链解释:
a defined a.[[scope]] –> 0 : GO
a doing a.[[scope]] –> 0: a AO
–> 1 : GO
b defined a.[[scope]] –> 0 : a AO
–> 1 : GO
b doing a.[[scope]] –> 0: b AO
–> 1 : a AO
–> 2 : GO
c defined a.[[scope]] –> 0 : b AO
–> 1 : a AO
–> 2 : GO
c doing a.[[scope]] –> 0: c AO
–> 1 : b AO
–> 1 : a AO
–> 2 : GO
总结:里面的能够访问并且改变外面的,外面的不能访问,执行里面的。里面的权利最大,外面的权利最小。