显式绑定直接覆盖隐式绑定。当使用.call()、.apply()或.bind()时,引擎跳过隐式规则,强制以传入对象为this;bind还固化this,使后续隐式调用无效;引擎按new→显式→隐式顺序判定this。

显式绑定直接覆盖隐式绑定的调用上下文
隐式绑定只在函数以 obj.method() 形式被调用时生效,它的本质是“看点号左边是谁”。但一旦你用 .call()、.apply() 或 .bind() 主动介入调用过程,引擎就会跳过隐式规则,直接采用你传入的对象作为 this 值——这不是“叠加”,而是“替代”。
代码能清楚说明这个覆盖关系
比如有这样一个函数和两个对象:
function say() { console.log(this.a); }
const obj1 = { a: 1, say };
const obj2 = { a: 2, say };
- obj1.say() → 隐式绑定,this 是 obj1,输出 1
- obj1.say.call(obj2) → 显式绑定优先触发,this 强制设为 obj2,输出 2
- obj2.say.apply(obj1) → 同样,this 取 apply 的第一个参数,输出 1
bind 的行为也印证了这一点
bind 返回一个新函数,它把 this “锁死”在指定对象上。即使这个函数后来被挂到另一个对象下再调用,隐式绑定也无法抢回控制权:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const boundSay = say.bind(obj1);
const obj3 = { a: 3, boundSay };
obj3.boundSay(); // 仍输出 1,不是 3
因为 bind 创建的函数内部已固化 this,引擎不会再尝试隐式查找。
引擎判断顺序决定了谁先说话
JavaScript 引擎检查 this 绑定时,按固定顺序:先看是不是 new 调用,再看有没有 call/apply/bind,然后才考虑是否属于对象方法调用。只要前一步匹配成功,后续规则就不再执行。显式绑定排在隐式绑定之前,所以它天然具有更高话语权。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










