可以用闭包封装函数工厂实现多次绑定this:闭包缓存fn和context,返回的boundfn通过apply动态绑定,as方法生成新实例并独立持有context,支持链式切换且不污染原函数。

可以用闭包封装一个函数工厂,返回能多次绑定 this 的可复用函数,核心是把目标上下文缓存起来,每次调用时动态绑定,而不是一次性 bind 后固化。
闭包保存上下文和原函数
闭包的作用是让内部函数持续访问外部作用域中传入的 fn 和 context,这样每次调用返回的函数都能基于最新传入的 this 值执行,不依赖初始绑定。
例如:
- 接收原始函数
fn和默认上下文(可选) - 返回一个新函数,该函数接受任意参数,并在调用时使用指定的
this - 支持后续通过方法显式切换
this,比如.as(thisArg)
提供链式切换 this 的 API
返回的函数本身挂载一个 as 方法,它不改变原函数,而是返回一个新的、绑定了新 this 的函数,利用闭包捕获新上下文并复用原逻辑。
示例实现:
function bindThis(fn) {
if (typeof fn !== 'function') throw new TypeError('Expected function');
function boundFn(...args) {
return fn.apply(boundFn.context, args);
}
boundFn.context = null;
boundFn.as = function(thisArg) {
const newBound = bindThis(fn);
newBound.context = thisArg;
return newBound;
};
return boundFn;
}
支持多次重定向,且不污染原函数
每次调用 .as() 都生成独立的新函数实例,各自持有自己的 context,互不影响。原函数始终不变,符合函数式设计原则。
使用方式:
const logName = bindThis(function() { console.log(this.name); });logName.as({ name: 'Alice' })(); // 输出 AlicelogName.as({ name: 'Bob' })(); // 输出 Bob- 同一
logName可无限次生成不同绑定版本
兼容普通调用与构造调用(可选增强)
如果需要支持 new boundFn() 场景,可在内部判断是否为构造调用,避免 apply 破坏原型链:
- 检查
new.target是否存在 - 若是构造调用,用
Reflect.construct或Object.create模拟 - 否则正常
apply
这样工具既能做方法绑定,也能代理构造器,适用性更广。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











