多次调用 bind 不会改变 this 指向,始终为首次 bind 传入的对象;仅 new 调用可覆盖该绑定,使 this 指向新实例,预设参数仍生效。

多次调用 bind 不会改变最终的 this 指向——它始终是第一次 bind 时传入的那个对象。
硬绑定不可覆盖
bind 创建的是“硬绑定”函数,它的核心特性就是 this 被永久锁定。一旦绑定,后续任何显式绑定操作(包括再次 bind、call 或 apply)都无法修改这个 this 值。
- 第一次
bind(obj1)→this固定为obj1 - 对已绑定函数再调用
.bind(obj2)→ 新函数仍以obj1为this,obj2被完全忽略 - 即使写成
boundFn.call(obj3)或boundFn.apply(obj4, [...]),this也还是obj1
参数会叠加,但 this 不会
bind 的预设参数(柯里化)是累积生效的,而 this 绑定只认第一次。
-
fn.bind({x: 1}, 'a')→this是{x: 1},首参固定为'a' - 再
.bind({x: 2}, 'b')→this仍是{x: 1},参数变成['a', 'b'](按顺序追加) - 最终调用
doubleBound(10)相当于fn('a', 'b', 10),且this.x === 1
唯一能绕过硬绑定的场景:new 调用
只有通过 new 操作符调用 bind 后的函数时,this 才会指向新创建的实例,此时第一次 bind 设定的 this 被忽略。
立即学习“Java免费学习笔记(深入)”;
const Ctor = original.bind({x: 1});-
const inst = new Ctor();→this是inst,不是{x: 1} - 注意:预设参数依然有效,只是
this绑定被 new 规则覆盖
想动态换 this?别用 bind
如果需要每次调用都灵活指定 this,就不要提前 bind,而是保留原函数,用 call 或 apply 显式传入:
-
fn.call(objA, arg1, arg2)→this是objA -
fn.call(objB, arg1, arg2)→this是objB - 这样才真正具备运行时控制力


















