作用域和作用域链

对这一块的概念一直模棱两可的,今天听了个视频,觉得有种茅塞顿开的感觉。故做此总结:

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

查找变量只要访问该函数执行时的作用域链就可以了,函数执行之后会扔掉自己的执行上下文。

大概就是这个意思,遇到函数还是要多分析,多思考,渐渐地就自成体系了,学习中,望大家指教~    

原文地址:https://www.cnblogs.com/xuniannian/p/8084965.html