new绑定优先级最高,无论函数是否被bind或作为方法调用,只要用new调用,this必指向新实例;显式绑定仅在非new场景生效,且箭头函数不支持call/apply/bind。

new 绑定优先级高于显式绑定。
new 绑定总是胜出
只要函数被 new 调用,无论它是否已被 bind 过、是否在对象上作为方法存在、或是否被 call/apply 调用过,this 都会指向新创建的实例对象。
- new 操作内部会强制将 this 绑定到新对象,并跳过所有其他绑定逻辑
- 即使对一个已用
bind(obj)固定 this 的函数执行new boundFn(),最终 this 仍指向新实例,不是 obj - 构造函数若显式返回一个对象,则 this 绑定失效(但 new 绑定本身仍发生,只是返回值覆盖了 this 所在对象)
显式绑定只在非 new 场景下生效
call、apply、bind 的作用是手动指定 this,但它们的效力仅限于普通调用或方法调用场景。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
fn.call(obj)或fn.apply(obj)立即执行,this 为 obj —— 前提是没用 new -
const bound = fn.bind(obj)返回一个硬绑定函数,后续调用时 this 固定为 obj —— 除非用 new 调用它 - 箭头函数不参与显式绑定:call/apply/bind 对它无效,因为它没有自己的 this
优先级链不能跳过
JavaScript 的 this 绑定按固定顺序判断,不会“混合”或“叠加”:
- 先看是否 new 调用 → 是,直接走 new 绑定
- 否则看是否 call/apply/bind → 是,走显式绑定
- 再看是否对象.方法() → 是,走隐式绑定
- 最后才是默认绑定(严格模式为 undefined,非严格为全局对象)
常见误判点
容易以为 bind 后的函数“永远绑定 this”,其实它只是“永久绑定”,不是“绝对绑定”。
-
const f = foo.bind({x:1}); f();→ this 是 {x:1} -
const f = foo.bind({x:1}); new f();→ this 是新实例,{x:1} 被忽略 -
obj.method.call(other);→ this 是 other,不是 obj(显式覆盖隐式)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










