bind的核心作用是创建新函数并永久绑定this与预设参数,不修改原函数;其本质为函数复刻加this锁定,通过闭包保存绑定值,调用时强制使用,支持柯里化且多次bind仅首次生效。

bind 的核心作用不是“挂载”,而是创建一个新函数,该函数调用时 this 永远绑定为指定对象,且预设部分参数。
bind 本质是函数复刻 + this 锁定
它不会修改原函数,也不改变原对象结构,而是返回一个新函数。这个新函数内部通过闭包保存了目标 this 值和初始参数,在每次调用时强制使用它们。
- 原函数的 this 不受影响,仍按普通调用规则(如默认绑定、隐式绑定)决定
- bind 返回的函数,无论怎么调用(作为普通函数、方法、被 setTimeout 调用),this 都不变
- 多次 bind 只有第一次生效,后续 bind 无法覆盖最初绑定的 this
手动实现一个简易 bind
理解原理有助于避免误用。一个基础实现如下:
Function.prototype.myBind = function (thisArg, ...presetArgs) {
const fn = this;
return function (...callArgs) {
return fn.apply(thisArg, presetArgs.concat(callArgs));
};
};
关键点:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 用 apply 显式指定 this 和参数,确保执行时上下文不丢失
- 支持柯里化:预设参数(presetArgs)与调用时参数(callArgs)合并传入
- 返回函数需能被 new 调用(实际 bind 还需处理构造函数场景,此处简化)
常见误用:以为 bind 会“挂载”到对象上
例如:
const obj = { name: 'Alice' };
function say() { console.log(this.name); }
obj.say = say.bind(obj);
// 看似“挂载”了,其实只是把绑定后的函数赋值给 obj.say
真正发生的是:
- say.bind(obj) 创建了一个新函数,其 this 永远是 obj
- obj.say = … 是属性赋值,不是“绑定注入”或“上下文注入”
- 如果 later 删除 obj.say,原 say 函数不受影响,绑定函数也仅随引用消失
替代方案对比:call/apply vs bind
三者都控制 this,但时机不同:
- call/apply:立即执行,适合一次性调用
- bind:不执行,只返回绑定后的新函数,适合事件监听、回调传参、柯里化等延迟场景
- 箭头函数:没有自己的 this,自动继承外层词法作用域的 this,不可用 call/bind 修改

















