javascript--作用域解析
javascript -- 作用域
作用域:
[[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
总结:里面的能够访问并且改变外面的,外面的不能访问,执行里面的。里面的权利最大,外面的权利最小。