new绑定优先级最高,函数被new调用时this必为新实例,无视bind、call、apply及对象调用;显式绑定仅在非构造调用中生效;箭头函数无this绑定机制,其this由外层词法作用域决定。

new 绑定永远高于显式绑定——只要函数被 new 调用,this 就一定指向新创建的实例,不管它是否被 bind 过、是否在对象上调用、甚至是否带 call 或 apply 的痕迹。
new 绑定是“一锤定音”的构造行为
引擎执行 new Fn() 时,内部会严格按四步走:创建空对象 → 链接原型 → 把 this 绑定到该对象 → 执行函数体。第三步就已锁定 this,后续任何显式绑定都会被忽略。
-
const bound = Fn.bind({x: 1}); new bound()→ this 是新实例,不是{x: 1} -
const obj = { method: Fn }; new obj.method()→ this 仍是新实例,不取obj - ES6 class 的 constructor 必须用 new,否则直接报错,语义上已脱离普通函数范畴
显式绑定只在“非构造调用”中生效
call、apply、bind 的作用是解决普通函数复用时的上下文问题,它们的绑定只在函数以“常规方式”执行时起效。
-
fn.call(obj)或fn.apply(obj)→ this 立即为 obj -
const boundFn = fn.bind(obj); boundFn()→ this 永久为 obj(硬绑定) - 但
new boundFn()会绕过 bind,this 回归新实例 - 传
null或undefined给 call/apply,在非严格模式下会被自动转成全局对象
混合场景下,优先级不是“选择”,而是“执行顺序”
JavaScript 引擎不看开发者意图,只看调用形式。判断时只需三步:
立即学习“Java免费学习笔记(深入)”;
- 有没有 new?有 → this 是新实例,结束
- 没有 new,但用了 .call()、.apply() 或 bind()?有 → this 是显式指定的对象
- 以上都没有 → 看调用写法:
obj.fn()中的 this 是obj;const f = obj.fn; f()则退化为默认绑定
箭头函数不参与 this 绑定竞争
它没有自己的 this,也不响应 new、call、apply、bind。它的 this 值完全由外层普通函数的执行上下文决定,属于词法绑定,不在优先级链里。
-
const arrow = () => this;→ this 取决于定义时外层函数的 this,调用时无法改变 - 对箭头函数使用
call或bind不会改变 this,也不会报错,只是无效操作 - 箭头函数不能被 new 调用,否则抛出
TypeError: xxx is not a constructor


















