绑定规则:
- 默认绑定
- 隐式绑定
- 显示绑定
- new绑定
判断this
现在我们可以根据优先级来判断函数在某个调用位置应用的是哪条规则。 可以按照下面的顺序来进行判断:
- 函数是否在 new 中调用( new 绑定) ? 如果是的话 this 绑定的是新创建的对象。
var bar = new foo() - 函数是否通过 call、 apply( 显式绑定) 或者硬绑定调用? 如果是的话, this 绑定的是
指定的对象。
var bar = foo.call(obj2) - 函数是否在某个上下文对象中调用( 隐式绑定) ? 如果是的话, this 绑定的是那个上
下文对象。
var bar = obj1.foo() - 如果都不是的话, 使用默认绑定。 如果在严格模式'use strict'下, 就绑定到 undefined, 否则绑定到
全局对象。
var bar = foo()
绑定例外
一定要注意, 有些调用可能在无意中使用默认绑定规则。 如果想“ 更安全” 地忽略 this 绑定, 你可以使用一个 DMZ 对象, 比如 ø = Object.create(null), 以保护全局对象。
ES6 中的箭头函数并不会使用四条标准的绑定规则, 而是根据当前的词法作用域来决定this, 具体来说, 箭头函数会继承外层函数调用的 this 绑定( 无论 this 绑定到什么)。 这其实和 ES6 之前代码中的 self = this 机制一样。