每天 10 分钟,学习 JavaScript —— (十四)执行上下文

137 阅读1分钟

代码分类(位置)

  • 全局代码
  • 函数(局部)代码

全局执行上下文(顺序)

  • 在执行全局代码前将window确定为全局执行上下文
  • 在对全局数据进行预处理
    • var 定义的全局变量 ==> undefined,添加为window的属性
    • function 声明的全局函数 ==> 赋值(fun),添加为window的方法
    • this ==> 赋值(window)
  • 开始执行全局代码
    console.log(a1) // undefined
    a2() // "a2()"
    var a1 = 3
    console.log(a1) // 3
    function a2() {
      console.log('a2()')
    }

函数执行上下文(顺序)

  • 在调用函数,准备执行函数体之前,创建对应的函数执行上下文对象
  • 对局部数据进行预处理
    • 形参变量 ==> 赋值(实参) ==> 添加为执行上下文的属性
    • arguments ==> 赋值(实参列表),添加为执行上下文的属性
    • var 定义的局部变量 ==> undefined,添加为执行上下文的属性
    • function 声明的全局函数 ==> 赋值(fun),添加为执行上下文的属性
    • this ==> 赋值(调用函数的对象)
  • 开始执行函数体代码
    function fn(a1) {
      console.log(a1) // 2
      console.log(a2) // undefined
      a3() // "a3()"
      console.log(this) // [object Window]
      console.log(arguments) // Object { 0: 2, 1: 3 }
      var a2 = 3
      console.log(a2) // 3
      function a3() {
        console.log('a3()')
      }
    }
    fn(2, 3)