• 作用域和作用域链


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

    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

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

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

  • 相关阅读:
    bzoj2809 [Apio2012]dispatching
    bzoj2743[HEOI2012]采花
    bzoj3626[LNOI2014]LCA
    bzoj2038 [2009国家集训队]小Z的袜子(hose)——莫队
    bzoj2442[Usaco2011 Open]修剪草坪——单调队列优化
    bzoj1588[HNOI2002]营业额统计——双向链表
    洛谷1527(bzoj2738)矩阵乘法——二维树状数组+整体二分
    bzoj1503[NOI2004]郁闷的出纳员——Splay
    洛谷P2014——选课
    洛谷P1352——动规
  • 原文地址:https://www.cnblogs.com/xuniannian/p/8084965.html
Copyright © 2020-2023  润新知