显式绑定(call/apply/bind)优先级高于隐式绑定,硬绑定函数的this不可被后续call/apply覆盖;嵌套调用中先判bind、再判显式、最后隐式。

在 JavaScript 中,this 的绑定规则中,显式绑定(通过 call、apply、bind)确实优先级高于隐式绑定(如对象方法调用 obj.fn())。分析执行结果时,关键不是“谁调用了函数”,而是“函数是否被显式绑定了 this”。
显式绑定会覆盖隐式绑定的典型场景
当一个函数既满足隐式绑定条件(比如作为对象属性被调用),又被显式绑定(如用 call 调用),则显式绑定生效,隐式绑定被忽略。
- 隐式绑定依赖调用位置:形如
obj.method()会让method内的this指向obj - 显式绑定直接指定
this值:无论函数从哪来、怎么挂载,fn.call(obj2)就强制让this指向obj2 - 即使函数是
obj1.method,只要用obj1.method.call(obj2),this就是obj2,和obj1无关
bind 创建的硬绑定函数无法被后续 call/apply 覆盖(特殊情况)
bind 返回的是一个“硬绑定函数”,其内部 this 被永久锁定。即便再用 call 或 apply 尝试修改,也不会生效(除非传入 null/undefined 且处于非严格模式,但现代实践通常忽略该边缘行为)。
-
const bound = fn.bind(obj1); bound();→this === obj1 -
bound.call(obj2);→this仍是obj1(硬绑定优先级最高) - 只有普通函数(未 bind 过)才服从“显式 > 隐式”的一般规则
嵌套调用中的 this 分析步骤
遇到类似 obj1.obj2.method.call(obj3) 的写法,按以下顺序判断:
- 先看函数本身是否已被
bind:是 → 硬绑定生效,忽略后面所有 - 否则看调用时是否用了
call/apply/bind:是 → 取显式传入的对象(obj3) - 否则看是否为对象方法调用(
.左侧有对象):是 → 隐式绑定(obj2) - 否则按默认绑定(非严格模式为
window,严格模式为undefined)
一个直观例子
(不带 class,纯函数与对象)
function foo() { console.log(this.a); }
const obj1 = { a: 1, foo };
const obj2 = { a: 2 };
const obj3 = { a: 3 };
obj1.foo(); // 1 → 隐式绑定,this 指向 obj1
obj1.foo.call(obj2); // 2 → 显式绑定优先,this 指向 obj2(覆盖 obj1)
const hardFoo = foo.bind(obj3);
hardFoo(); // 3 → 硬绑定,不可被覆盖
hardFoo.call(obj1); // 3 → 仍为 obj3,call 无效Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











