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 表达式中的函数调用会自动返回这个新对象