为执行中的函数判定 this
绑定需要找到这个函数的直接调用点。找到之后,四种规则将会以这种优先顺序施用于调用点:
通过 new
调用?使用新构建的对象。
通过 call
或 apply
(或 bind
)调用?使用指定的对象。
通过持有调用的环境对象调用?使用那个环境对象。
默认:strict mode
下是 undefined
,否则就是全局对象。
小心偶然或不经意的 默认绑定 规则调用。如果你想“安全”地忽略 this
绑定,一个像 ø = Object.create(null)
这样的“DMZ”对象是一个很好的占位值,以保护 global
对象不受意外的副作用影响。
与这四种绑定规则不同,ES6 的箭头方法使用词法作用域来决定 this
绑定,这意味着它们采用封闭他们的函数调用作为 this
绑定(无论它是什么)。它们实质上是 ES6 之前的 self = this
代码的语法替代品。