JS执行上下文

97 阅读2分钟

JS执行上下文

执行上下文有三种:全局执行上下文,函数执行上下文,eval 执行上下文(现在不会使用 eval,所以考虑)

  • 全局执行上下文在页面首次加载是会被创建

  • 函数执行上下文,当函数被调用的时候会被创建,当函数调用结束函数执行上下文会被销毁。 同一个函数被调用多次,会创建多个函数执行上下文

    多个执行上下文 以执行上下文栈(执行栈)的形式存储,当函数被调用时,函数执行上下文入栈,当函数执行结束,函数执行上下文出栈。调用栈的底部是全局执行上下文

执行上下文创建三阶段:

  1. 绑定 this
  2. 创建词法环境
  3. 创建变量环境 词法环境存放 let、const 声明的变量 和 函数声明 变量环境存放 var 声明的变量

词法环境有环境记录外部环境引入记录组成

全局执行上下文 和 函数执行上下文的环境记录不同:

  • 全局执行上下文叫对象环境记录,
  • 全局执行上下文叫声明性环境记录

全局执行上下文 和 函数执行上下文的外部环境引入记录不同:

  • 全局执行上下文,由于没有引入外部环境,因此外部环境引入记录为 null
  • 函数执行上下文,外部引入环境记录可能是全局环境 或者 其他函数环境
//全局执行上下文
GlobalExectionContext = {
    // this绑定为全局对象
    ThisBinding: '<Global Object>',
    // 词法环境
    LexicalEnvironment: {
        //环境记录
      EnvironmentRecord: {
        Type: "Object",  // 对象环境记录
        // 标识符绑定在这里 let const创建的变量a b在这
        a: < uninitialized >,
        b: < uninitialized >,
        multiply: < func >
      }
      // 全局环境外部环境引入为null
      outer: <null>
    },

    VariableEnvironment: {
      EnvironmentRecord: {
        Type: "Object",  // 对象环境记录
        // 标识符绑定在这里  var创建的c在这
        c: undefined,
      }
      // 全局环境外部环境引入为null
      outer: <null>
    }
  }

  // 函数执行上下文
  FunctionExectionContext = {
     //由于函数是默认调用 this绑定同样是全局对象
    ThisBinding: '<Global Object>',
    // 词法环境
    LexicalEnvironment: {
      EnvironmentRecord: {
        Type: "Declarative",  // 声明性环境记录
        // 标识符绑定在这里  arguments对象在这
        Arguments: {0: 20, 1: 30, length: 2},
      },
      // 外部环境引入记录为</Global>
      outer: <GlobalEnvironment>
    },

    VariableEnvironment: {
      EnvironmentRecord: {
        Type: "Declarative",  // 声明性环境记录
        // 标识符绑定在这里  var创建的g在这
        g: undefined
      },
      // 外部环境引入记录为</Global>
      outer: <GlobalEnvironment>
    }
  }