zoukankan      html  css  js  c++  java
  • 作用域和作用域链

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

    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

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

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

  • 相关阅读:
    动态横向(水平)合并Repeater数据行DataItem的列
    动态绑数据(Repeater控件HeaderTemplate和ItemTemplate)
    动态横向(水平)合并GridView数据行DataRow的列
    动态绑数据(GridView控件Header和ItemTemplate)
    用具体列名替代星号
    如何实现数据行转换列显示
    用LINQ获取XML节点数据
    从字符串中获取XML节点数据
    字符串创建XML文档
    根据Attribute值条件对XML文档进行修改
  • 原文地址:https://www.cnblogs.com/xuniannian/p/8084965.html
Copyright © 2011-2022 走看看