如何辨析四大绑定规则在同一函数上交叉发生时的硬性优先级排列顺序

作者:袖梨 2026-06-23
this绑定优先级为:new > 显式绑定 > 隐式绑定 > 默认绑定;new调用时this必为新实例,忽略其他绑定;显式绑定通过call/apply/bind强制指定this;隐式绑定取点号左侧对象;默认绑定下非严格模式this为全局对象,严格模式为undefined。

直接看调用方式,按优先级从高到低依次判断:new > 显式绑定(call/apply/bind) > 隐式绑定(点号左边对象) > 默认绑定(独立调用)。

new 绑定永远最高

只要函数被 new 调用,this 就一定指向新创建的实例,其他所有绑定都被忽略。

  • 即使函数已被 bind 过,new bar() 中的 this 仍是新对象,不是 bind 指定的对象
  • 箭头函数不能用 new 调用,语法报错,所以不参与此规则
  • 构造函数若显式 return 一个非 null 对象,this 绑定失效,返回该对象

显式绑定紧随其后

当函数通过 call、apply 或 bind 调用时,this 被强制设为传入的第一个参数(除非是 null/undefined,此时退回到默认绑定)。

  • obj.method.call(otherObj) 中,this 是 otherObj,不是 obj
  • const bound = fn.bind(obj); bound() 中,this 始终是 obj,不可再被 call 改写
  • bind 返回的是硬绑定函数,但 new 它时仍会覆盖绑定

隐式绑定只看最后一层点号

函数以 obj.xxx() 形式调用时,this 是点号左边那个直接对象,不追溯嵌套链。

  • a.b.c.method() → this 是 c,不是 a 或 b
  • const fn = obj.method; fn() → 隐式绑定丢失,退化为默认绑定
  • 传给 setTimeout、数组方法等回调时,同样丢失隐式绑定

默认绑定是兜底规则

没被 new、没被 call/apply/bind、也没作为对象方法调用时,才触发默认绑定。

  • 非严格模式下,this 指向全局对象(如 window)
  • 严格模式下,this 是 undefined
  • 箭头函数不适用默认绑定——它没有自己的 this,直接沿用外层词法作用域

相关文章

精彩推荐