JavaScript 执行上下文解读

概念理解

执行上下文其实是函数调用的一个抽象环境,环境中包括了函数内部和外部所关联的所有的引用关系,这些引用关系会在函数执行的时候用到。执行上下文包括三种类型:

  • 分为全局执行上下文
  • 函数执行上下文
  • eval执行上下文

每个执行上下文都有三个属性

  • 变量对象
  • 作用域链
  • this

变量对象

  • 函数的形参(如果是在函数作用域中)
  • 函数声明
  • 变量声明

作用域链

局部变量 scope,用于存放当前执行上下文的父级执行上下文的引用

this

  • 默认绑定
    • 非严格模式下,默认绑定的 this 指向全局对象, window
    • 严格模式下,默认绑定的 this 指向的是 undefined
  • 隐式绑定
    • 当函数引用有上下文对象时,隐式绑定规则会把函数调用中的 this 绑定到这个上下文对象
    • 对象属性引用链中只有最顶层或者说最后一层会影响调用位置
    • 隐式绑定发生丢失,会触发默认绑定,将 this 绑定到全局对象或者 undefined
      • 隐式绑定丢失1,给函数起一个别名,通过别名调用函数
      • 隐式绑定丢失2,将函数作为实参,在另外的函数中通过形参调用这个函数(回调函数丢失 this)
  • 显式绑定
    • call() 第一个参数是给 this 绑定的对象,第二个参数是一个参数列表
    • apply() 第一个参数是给 this 绑定的对象,第二个参数是一个参数列表
    • bind() 会返回一个硬编码的新函数,他会把参数设置为 this 的上下文并调用原始函数
    • 如果传入一个原始值(字符串类型,布尔类型,或者数字类型)来当做 this 的绑定对象,这个原始值会被转换成他的对象形式,即“装箱”
  • new 绑定
    • 构造函数概念提要:所有的函数都可以通过 new 来调用,这种函数调用被称为构造函数调用。实际上并不存在“构造函数”,只有对于函数的“构造调用”
    • new 函数的构造调用过程
      • 1.创建(或者说构造)一个全新的对象
      • 2.这个新对象会被执行原型连接
      • 3.这个新对象会绑定到函数调用的 this
      • 4.如果函数没有返回其他对象,那么 new 表达式中的函数调用会自动返回这个新对象

JavaScript 执行上下文解读