作用域和作用域链
对这一块的概念一直模棱两可的,今天听了个视频,觉得有种茅塞顿开的感觉。故做此总结:
1.[[scope]]:每个javascript函数都是一个对象,对象中有些属性我们可以访问。但有些不可以,这些属性仅供javascript引擎存取,[[scope]]就是其中一个。
[[scope]]指的就是我们所说的作用域,其中存储了运行上下文的集合。
2.作用域链:[[scope]]中所存储的执行期上下文对象的集合,这个集合呈链式链接,我们把这种链式链接叫做作用域链
定义就是这么一种东西,你不懂得的时候觉得它说的全是废话,当你真的理解了的时候,就会觉得它总结的很到位。
我们来看个列子
function a(){
function b(){
function c(){
}
c();
}
b();
}
a();
对于这个函数
a definded a.[[scope]] --> 0:GO
a doing a.[[]scope] --> 0 : aAO //自己函数生成的作用域链在最顶部
--> 1 : GO
b definded b.[[scope] ] --> 0 : aAO //b是在a函数内部创建的,所以一开始就继承了a的作用域链
--> 1 : GO
b doing b.[[scope]] -->0 : bAO //生成自己的作用域链
--> 1 : aAO
--> 2 : GO
c definded c.[[scope] ] --> 0 : bAO //一开始就继承了b的作用域链
--> 1 : aAO
--> 2 : GO
c doing c.[[scope]] --> 0 : cAO //生成自己的作用域链
--> 1 : bAO
--> 2 : aAO
--> 3 : GO
查找变量只要访问该函数执行时的作用域链就可以了,函数执行之后会扔掉自己的执行上下文。
大概就是这个意思,遇到函数还是要多分析,多思考,渐渐地就自成体系了,学习中,望大家指教~