new绑定优先级最高,会覆盖显式、隐式及默认绑定;显式绑定次之,可覆盖隐式绑定但硬绑定不可被call/apply改写;隐式绑定依赖调用形式且易丢失;默认绑定为兜底规则,非严格模式指向全局对象,严格模式为undefined。

new 绑定是 this 四种绑定规则中优先级最高的,它会在函数调用时最先生效,直接覆盖其他所有绑定方式。
new 绑定压倒显式绑定
即使函数已被 bind、call 或 apply 显式设定过 this,只要以 new 方式调用,就会无视这些设定,把 this 指向新创建的实例对象。
-
const bound = foo.bind({x: 1}); new bound()→this是新实例,不是{x: 1} -
new obj.method()不走隐式绑定,也不执行obj上的上下文,只按构造调用处理 - 引擎在函数体执行前就完成 this 绑定,显式绑定没有机会介入
显式绑定次之,能覆盖隐式绑定
当没有 new 时,call、apply、bind 的指定会生效,并取代点号左侧的对象。
-
obj.method.call(other)→this是other,不是obj -
const bound = obj.method.bind(other); bound()→ 同样指向other - 注意:
bind返回的硬绑定函数,后续再用call也无法改写其this
隐式绑定只在无更高规则时触发
它依赖调用形式 obj.fn(),但非常脆弱,容易丢失。
-
const fn = obj.method; fn()→ 退化为默认绑定(非严格模式下是window) -
obj.inner.method()→this指向inner,不是obj - 箭头函数不适用此规则,它没有自己的
this,直接继承外层词法作用域
默认绑定是兜底规则
当以上三条都不满足,函数以普通方式调用(如 fn()),就启用默认绑定。
- 非严格模式下指向全局对象(浏览器中是
window) - 严格模式下为
undefined - 显式绑定传入
null或undefined时,也会回落到默认绑定

















