bind返回的函数其this值在创建时就被永久锁定,后续任何调用方式或call/apply都无法覆盖,且优先级高于隐式绑定和默认绑定,该绑定不可逆。

显式绑定 bind 返回的函数,其 this 值在创建时就被永久锁定,后续无论怎样调用(包括作为事件处理器、定时器回调、或被其他函数包裹),都无法被覆盖。
bind 创建的是一个“硬绑定”函数
Function.prototype.bind 返回一个新函数,该函数内部通过闭包保存了指定的 this 值,并在调用时强制使用它。这个绑定不可逆,优先级高于隐式绑定(如对象方法调用)和默认绑定(如独立函数调用)。
- 即使把 bind 后的函数赋值给另一个对象的属性再调用,
this仍指向 bind 时传入的目标对象 - 用
call或apply尝试重新指定this,也无效(除非原函数是用bind多次链式调用,但首次 bind 的 this 依然牢靠) - 箭头函数没有自己的
this,所以 bind 对它无影响——但 bind 本身不作用于箭头函数,因为箭头函数不能作为 bind 的调用者
bind 的 this 锁定发生在函数创建阶段
不是执行时决定,而是生成新函数那一刻就固化了 this 绑定。你可以理解为 bind 返回的函数内部类似这样实现:
function bound() {
return targetFn.apply(lockedThis, args.concat(Array.prototype.slice.call(arguments)));
}
其中 lockedThis 是闭包变量,从 bind 调用时就确定,之后永不改变。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
与 call/apply 的关键区别
call 和 apply 是立即执行并临时设置 this;而 bind 不执行原函数,只返回一个“预设好 this”的新函数。它相当于把 this 和部分参数一起打包封装,延迟调用。
-
fn.call(obj)→ 立即以obj为 this 执行 -
fn.bind(obj)→ 返回一个函数,以后每次调用都以obj为 this -
fn.bind(obj).call(otherObj)→this还是obj,otherObj被忽略
常见误用场景与验证方式
容易以为“方法赋值后调用会丢失 this”,但 bind 后就不会丢:
const obj = { name: 'Alice', say() { console.log(this.name); } };
const boundSay = obj.say.bind({ name: 'Bob' });
const alias = boundSay;
alias(); // 输出 'Bob',不是 'Alice',也不是 undefined
验证是否被 bind 过:可检查函数的 toString()(非标准但常见),或用 fn.hasOwnProperty('bound') 不可靠;更稳妥的是依赖行为测试——多次尝试覆盖 this 看是否生效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










