显式绑定优先级高于隐式绑定;只要调用中含call、apply或bind,this即由显式参数决定,隐式规则被跳过;隐式绑定仅在obj.fn()等直接调用时生效,且只取点左侧最近对象。

显式绑定优先级高于隐式绑定。只要函数调用中存在 call、apply 或 bind,无论它是否以 obj.method() 形式书写,this 都由显式指定的对象决定,隐式规则被完全跳过。
隐式绑定只看“点左边是谁”
当函数通过对象属性访问并直接调用时(如 obj.fn()),JavaScript 自动把 this 设为该对象——但仅限于最靠近函数的那层对象。例如:obj.inner.fn() 中 this 指向 inner,不是 obj。
- 必须是直接调用才生效:赋值给变量(
const f = obj.fn; f();)、传入回调(setTimeout(obj.fn, 100))、解构(const { fn } = obj; fn();)都会导致隐式绑定丢失 - 丢失后退化为默认绑定:非严格模式下是
window或globalThis,严格模式下是undefined
显式绑定会覆盖隐式逻辑
即使一个函数明显是某个对象的方法,只要用了 .call()、.apply() 或 .bind(),this 就按你传入的第一个参数走,和调用位置无关。
-
obj.fn.call(otherObj)→this是otherObj,不是obj -
const bound = obj.fn.bind(otherObj); bound();→ 同样是otherObj,且这个绑定不可被后续call覆盖(硬绑定) -
obj.fn.apply({ name: 'Lucy' }, ['hi'])→this是{ name: 'Lucy' }
注意 bind 的“永久性”特性
bind 返回的新函数自带固化 this,哪怕它原本来自隐式调用链,也已脱离原上下文。
-
const bound = obj.fn.bind({ x: 1 });之后,bound()的this始终是{ x: 1 } - 再对
bound使用.call({ y: 2 })无效,this不会变成{ y: 2 } - 唯一能覆盖
bind的方式是再次bind,或用new调用(此时触发 new 绑定,优先级更高)
判断时不用背顺序,只需观察调用形式:先看有没有 new,再看有没有 .call()/.apply()/.bind(),最后才看是不是 obj.method() 这样的写法。这样一步步下来,this 指向就非常确定了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











