bind绑定的函数无法被call覆盖this——call只传递后续参数,其第一个参数(thisArg)被完全忽略;唯一例外是new调用,此时this指向新实例,bind的this被忽略。

已经用 bind 绑定过的函数,再调用 call 是无效的——call 无法覆盖 bind 已经固化下来的 this 绑定。
bind 创建的是“硬绑定”函数
bind 返回的新函数具有不可变的 this 绑定,这是它的核心特性。一旦绑定,无论后续如何调用(直接调用、作为回调、用 call 或 apply),其内部 this 始终指向 bind 时传入的第一个参数(除非该函数被 new 调用)。
- 规范明确:ECMAScript 规定,
bind后的函数在调用时会忽略所有显式传入的thisArg(包括call和apply的第一个参数) - 即使你写
boundFn.call({x: 1}),函数体内this仍是bind时指定的对象,不是{x: 1}
call 对 bind 函数的实际效果
call 在绑定函数上仍会执行,但只影响两件事:
-
参数传递依然生效:
call后续的参数(第二个起)会按顺序追加到bind预设参数之后,正常传入原函数 -
this 绑定完全被忽略:
call的第一个参数(thisArg)被丢弃,不产生任何作用
例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
function fn(a, b) { console.log(this.name, a, b); }
const bound = fn.bind({ name: 'Alice' }, 'pre-a');
bound('post-b'); // Alice pre-a post-b
bound.call({ name: 'Bob' }, 'post-b'); // Alice pre-a post-b —— this 仍是 Alice
唯一能覆盖 bind this 的情况:new 调用
当用 new 操作符调用一个 bind 函数时,this 会指向新创建的实例对象,bind 时设定的 this 被忽略。
- 这是 ECMAScript 中“
new绑定优先级高于显式绑定”的体现 - 注意:此时预设参数仍有效,但
this不再是bind指定的对象
想动态切换 this?别用 bind,改用 call 或 apply
如果需要每次调用时都能灵活指定 this,就不要提前 bind,而是保留原函数,用 call 或 apply 每次显式传入:
-
fn.call(obj1, a, b)→this是obj1 -
fn.call(obj2, a, b)→this是obj2 - 这样才真正具备运行时控制力

















