zoukankan      html  css  js  c++  java
  • 深度剖析典型函数内部作用域链的动态变化

    function factory() {
         var name = 'laruence';
         var intro = function(){
              alert('I am ' + name);
         }
         return intro;
    }
     
    function app(para){
         var name = para;
         var func = factory();
         func();
    }
     
    app('eve');

    contentStack = {

        globalContext
    }

    globalContext = {

        globalariableObject : [factory,app],

        globalScopeChain : globalariableObject

    }

    app.[[Scope]] = globalScopeChain;

    ----------------------------------------------

    contentStack = {

        appContext,
        globalContext
    }

    appContext = {

        appariableObject : [arguments,para,name,func,factory,app],

        appScopeChain : [appariableObject, app.[[Scope]]]

    }

    factory.[[Scope]] = appScopeChain;

    -----------------------------------------------

    contentStack = {

        factoryContext,

        appContext,

        globalContext

    }

    factoryContext  = {

       factoryariableObject : [arguments, name, intro,factory],

       factoryScopeChain : [factoryariableObject, factoryScope]

    }

    intro.[[Scope]] = factoryScopeChain;

    ------------------------------------------------

    contentStack = {
        introContext,

        factoryContext,

        appContext,

        globalContext

    }

    introContext = {

        introariableObject = [arguments,name,intro],

        introScopeChain = [introariableObject, intro.[[Scope]]]

    }

    因此最终的执行结果是intro可以访问到的name,也即laruence。

  • 相关阅读:
    题解 P5320
    Codeforces 1500F
    三个 AGC D(AGC037D、AGC043D、AGC050D)
    Atcoder Regular Contst 084 D
    DG-基础知识点整理
    MySQL-数据恢复场景实验
    MySQL-查看Galera集群状态
    MySQL-运行日志切割
    MySQL-生产环境删除大表或大量binlog策略
    MySQL-基于(MySQL 5.7)NDB中启用共享权限表
  • 原文地址:https://www.cnblogs.com/jiangtian/p/6508427.html
Copyright © 2011-2022 走看看