显式绑定优先级高于隐式绑定,且 bind 创建的硬绑定不可被 call/apply 覆盖;箭头函数无 this,继承外层作用域 this。

显式绑定优先级高于隐式绑定。只要函数被 call、apply 或 bind 调用,this 就按传入的第一个参数确定,不管它是不是以 obj.method() 的形式出现。
显式绑定会直接覆盖隐式绑定
即使函数看起来是“对象的方法”,只要用了 .call() 或 .apply(),this 就不再指向点号左边的对象,而是你指定的那个对象。
-
obj.fn.call(otherObj)→ this 是otherObj,不是obj -
const bound = obj.fn.bind(otherObj); bound();→ this 仍是otherObj -
obj.fn.bind(otherObj).call({x:1})→ 仍然指向otherObj,因为bind创建的是硬绑定,call无法覆盖
隐式绑定只在没显式干预时才生效
所谓“对象方法调用”,前提是函数**直接通过点号或方括号调用**,且**没有被 call/apply/bind 中途介入**。
-
obj.fn()→ this 是obj -
const fn = obj.fn; fn();→ 隐式绑定丢失,退化为默认绑定(非严格模式下是window) -
(obj.nested.fn)()→ 仍属隐式绑定,this 是nested,不是obj
注意 bind 的“硬绑定”特性
bind 返回的函数自带 this 绑定,后续任何普通调用(包括再用 call)都无法改写它——除非用 new 调用,那才会触发更高优先级的 new 绑定。
立即学习“Java免费学习笔记(深入)”;
-
const bound = fn.bind({a:1}); bound.call({b:2});→ this 还是{a:1} -
new bound();→ this 是新实例,bind指定的对象被忽略
箭头函数不参与这套规则
箭头函数没有自己的 this,它不响应任何绑定规则(包括 call、apply、bind 或隐式调用),只继承外层普通函数作用域中的 this 值。
-
const obj = { fn: () => console.log(this) }; obj.fn();→ 输出的是定义时外层的this,不是obj -
obj.fn.call({x:1});→ 无效,箭头函数的this不可被显式修改


















