this绑定优先级为:new > 显式绑定 > 隐式绑定 > 默认绑定;new调用时this必为新实例,忽略其他绑定;显式绑定通过call/apply/bind强制指定this;隐式绑定取点号左侧对象;默认绑定下非严格模式this为全局对象,严格模式为undefined。
直接看调用方式,按优先级从高到低依次判断:new > 显式绑定(call/apply/bind) > 隐式绑定(点号左边对象) > 默认绑定(独立调用)。
只要函数被 new 调用,this 就一定指向新创建的实例,其他所有绑定都被忽略。
new bar() 中的 this 仍是新对象,不是 bind 指定的对象当函数通过 call、apply 或 bind 调用时,this 被强制设为传入的第一个参数(除非是 null/undefined,此时退回到默认绑定)。
obj.method.call(otherObj) 中,this 是 otherObj,不是 objconst bound = fn.bind(obj); bound() 中,this 始终是 obj,不可再被 call 改写函数以 obj.xxx() 形式调用时,this 是点号左边那个直接对象,不追溯嵌套链。
a.b.c.method() → this 是 c,不是 a 或 bconst fn = obj.method; fn() → 隐式绑定丢失,退化为默认绑定没被 new、没被 call/apply/bind、也没作为对象方法调用时,才触发默认绑定。