美文网首页
执行上下文

执行上下文

作者: 怪物猎人 | 来源:发表于2018-03-22 10:52 被阅读0次

    原文出处

    JavaScript深入之执行上下文

    具体执行分析


    代码如下:

    var scope = "global scope";
    function checkscope(){
        var scope = "local scope";
        function f(){
            return scope;
        }
        return f();
    }
    checkscope();
    

    执行过程如下:

    1. 执行全局代码,创建全局执行上下文,全局上下文被压入执行上下文栈
        ECStack = [
            globalContext
        ];
    
    1. 全局上下文初始化
        globalContext = {
            VO: [global],
            Scope: [globalContext.VO],
            this: globalContext.VO
        }
    
    1. 初始化的同时,checkscope 函数被创建,保存作用域链到函数的内部属性[[scope]]
       checkscope.[[scope]] = [
          globalContext.VO
        ];
    
    1. 执行 checkscope 函数,创建 checkscope 函数执行上下文,checkscope 函数执行上下文被压入执行上下文栈
        ECStack = [
            checkscopeContext,
            globalContext
        ];
    
    1. checkscope 函数执行上下文初始化:
      1. 复制函数 [[scope]] 属性创建作用域链,
      2. 用 arguments 创建活动对象,
      3. 初始化活动对象,即加入形参、函数声明、变量声明,
      4. 将活动对象压入 checkscope 作用域链顶端。

    同时 f 函数被创建,保存作用域链到 f 函数的内部属性[[scope]]

     checkscopeContext = {
            AO: {
                arguments: {
                    length: 0
                },
                scope: undefined,
                f: reference to function f(){}
            },
            Scope: [AO, globalContext.VO],
            this: undefined
        }
    
    1. 执行 f 函数,创建 f 函数执行上下文,f 函数执行上下文被压入执行上下文栈
        ECStack = [
            fContext,
            checkscopeContext,
            globalContext
        ];
    
    1. f 函数执行上下文初始化, 以下跟第 4 步相同:

      1. 复制函数 [[scope]] 属性创建作用域链
      2. 用 arguments 创建活动对象
      3. 初始化活动对象,即加入形参、函数声明、变量声明
      4. 将活动对象压入 f 作用域链顶端
        fContext = {
            AO: {
                arguments: {
                    length: 0
                }
            },
            Scope: [AO, checkscopeContext.AO, globalContext.VO],
            this: undefined
        }
    
    1. f 函数执行,沿着作用域链查找 scope 值,返回 scope 值
    2. f 函数执行完毕,f 函数上下文从执行上下文栈中弹出
        ECStack = [
            checkscopeContext,
            globalContext
        ];
    
    1. checkscope 函数执行完毕,checkscope 执行上下文从执行上下文栈中弹出
        ECStack = [
            globalContext
        ];
    

    相关文章

      网友评论

          本文标题:执行上下文

          本文链接:https://www.haomeiwen.com/subject/brioqftx.html