显式绑定永远压倒隐式绑定:只要调用中出现call、apply或bind,this即由显式参数决定,点号左侧对象失效;隐式绑定仅在“干净调用”(无new、无显式绑定、通过点号/方括号调用)时生效;bind创建硬绑定,不可被后续call/apply覆盖。

显式绑定和隐式绑定不会“嵌套”,而是按固定优先级互斥生效:显式绑定直接覆盖隐式绑定,不存在层层嵌套或混合计算的逻辑。
显式绑定永远压倒隐式绑定
只要调用中出现了 call、apply 或 bind,this 就由显式指定的对象决定,点号左侧的对象完全失效。
-
obj.method.call(otherObj)→ this 是otherObj,不是obj -
const bound = obj.method.bind({x: 1}); bound();→ this 是{x: 1},哪怕它原本是obj的方法 - 即使写成
(obj.method).call(otherObj),括号不改变调用本质,仍是显式生效
隐式绑定只在“干净调用”时起作用
所谓“干净”,是指既没 new,也没 call/apply/bind,且函数确实通过点号或方括号方式被调用。
-
obj.method()→ this 是obj(隐式生效) -
obj.nested.fn()→ this 是nested(只看最靠近函数的左侧对象) -
const f = obj.method; f();→ 隐式绑定丢失,退化为默认绑定(严格模式下是undefined)
bind 创建的是硬绑定,无法被后续 call/apply 覆盖
bind 返回的新函数自带固化 this,它的优先级比 call 和 apply 更高——这不是“嵌套”,而是绑定时机不同导致的不可逆固化。
-
const bound = fn.bind(obj); bound.call({x: 2});→ this 仍是obj,不是{x: 2} - 只有未 bind 的原始函数,才能被
call或apply临时改写 this
判断顺序就三步,不用套公式
遇到一个函数调用,直接按顺序问自己:
- 是不是用
new调用的?→ 是:this 指向新实例,其余全忽略 - 有没有
.call()、.apply()或.bind()?→ 是:this 由显式参数决定 - 否则,看调用形式:
a.b.c.fn()→ this 是c;fn()→ 默认绑定











