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,但它们的效力仅限于普通调用或方法调用场景。
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 javascript




还木有评论哦,快来抢沙发吧~