bind方法返回的函数具有永久绑定的this值和预设参数,调用时不可被call/apply改变,但new调用会忽略this绑定而保留参数传递。

bind 方法返回的函数,其 this 值在创建时就已固定,后续无论怎么调用(包括 new、call、apply),都不会改变这个绑定关系——这就是“永久绑定”。
bind 返回的函数自带不可变的 this
当你调用 func.bind(obj),JavaScript 引擎会生成一个新函数。这个函数内部记住了 obj 作为 this,并且这个绑定在函数被调用时强制生效,不随调用方式而改变。
- 即使对 bind 后的函数再用
call或apply传入其他对象,this 仍为最初 bind 的对象 - 直接调用(如
boundFn())或作为回调、事件处理器使用,this 也保持不变 - 该函数的
length属性是原函数形参个数(不计 bind 预设参数)
bind 预设参数也会被“冻结”
bind 支持预填部分参数:func.bind(obj, a, b)。这些参数会永远排在实际调用时传入参数的前面。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如:
const add5 = (x) => x + 5; const add10 = add5.bind(null, 10);—— 这样写不对,因为箭头函数没有 this,但普通函数可以:function sum(a, b) { return a + b; } const add3 = sum.bind(null, 3); add3(7); // 10 - 预设参数和 this 一样,在 bind 调用那一刻就确定,无法被覆盖
new 调用时是个例外:this 会“失效”,但函数仍可执行
如果对 bind 后的函数使用 new(即当作构造函数),它的 this 绑定会被忽略,转而指向新创建的实例——这是规范规定的特殊行为。
立即学习“Java免费学习笔记(深入)”;
- 此时预设参数仍然有效,会传给原函数
- 原型链会正确连接到原函数的 prototype(不是绑定函数的)
- 所以它仍能当构造器用,只是 this 不再是 bind 指定的对象
想彻底锁定所有行为?得手动封装
bind 本身不阻止 new 调用改变 this,若需绝对“永久”(连 new 都不能绕过),需自行包装:
- 用闭包保存目标 this 和预设参数
- 在包装函数内判断是否被 new 调用(检查
this instanceof boundFn),若是则抛错或降级处理 - 或者直接返回一个无 prototype 的箭头函数(但箭头函数不能 new)

















