显式绑定优先级高于隐式绑定,因引擎按new→call/apply/bind→obj.fn()→默认顺序匹配,命中即止;bind固化this,使后续隐式调用无效。

显式绑定优先级高于隐式绑定,不是“更强”,而是“更早被引擎采纳”——只要调用中出现了 call、apply 或 bind,JavaScript 引擎就不再考虑“点号左边是谁”这类隐式规则。
看调用形式就能快速判断
隐式绑定只在 obj.method() 这种写法下触发,核心是“看函数调用时紧挨着的直接对象”。而显式绑定出现在 fn.call(obj)、fn.apply(obj, [...])、fn.bind(obj) 中,它不依赖调用位置,而是靠你主动传参指定 this。
-
obj.say()→ 隐式:this 是obj -
obj.say.call(other)→ 显式:this 强制变成other,隐式规则被跳过 -
const bound = say.bind(obj); other.bound()→ 绑定已固化,即使挂到other下,this 仍是obj
引擎按固定顺序检查 this,显式排在隐式之前
JavaScript 引擎判定 this 不是“比较谁更合理”,而是严格按优先级顺序逐条匹配:
- 先判断是否为
new调用(最高) - 再判断是否使用了
call/apply/bind(第二) - 接着才看是否符合
obj.fn()形式(第三) - 最后 fallback 到默认绑定(最低)
一旦某条规则命中,后续规则就不再执行。所以显式绑定天然压制隐式绑定,不是覆盖,是“没机会轮到它”。
立即学习“Java免费学习笔记(深入)”;
bind 的固化效果最能说明问题
bind 返回的新函数内部已硬编码 this 值,后续任何隐式调用都无法改变它:
function say() { console.log(this.a); }
const obj1 = { a: 1 };
const obj2 = { a: 2, sayBound: say.bind(obj1) };
obj2.sayBound(); // 输出 1,不是 2
这里 sayBound 是作为 obj2 的方法被调用的,满足隐式绑定条件,但因为 bind 已在创建时锁死 this,引擎连隐式规则都不进入。
常见误区:别把“写法像隐式”当成隐式生效
下面这些写法看起来有“点号”,但实际不触发隐式绑定:
-
const fn = obj.say; fn()→ 提取后独立调用,退化为默认绑定 -
setTimeout(obj.say, 100)→ 回调中obj.say被当作普通函数传入,失去上下文 -
const { say } = obj; say()→ 解构导致隐式丢失
这些场景若想保留 obj 上下文,必须显式介入:setTimeout(obj.say.bind(obj), ...) 或 setTimeout(() => obj.say(), ...)。


















