apply可显式绑定this,需手动调用并传入目标对象和参数数组,适用于事件监听等this丢失场景;可封装为bind-like函数实现柯里化与复用,但箭头函数无法通过apply改变this。

当函数作为回调或赋值给变量后调用时,this 会丢失原始绑定,指向 undefined(严格模式)或全局对象。用 apply 可以显式指定 this 值,从而“自动校正”——但注意:apply 本身不会“自动”修复,它需要你主动调用并传入正确的上下文。
用 apply 显式绑定 this
apply 接收两个参数:第一个是希望绑定给 this 的对象,第二个是参数数组。只要在调用前用 apply 指定目标上下文,就能确保函数内 this 指向预期对象。
- 适用于事件监听、定时器、异步回调等容易丢失
this的场景 - 必须手动调用,不是“自动”发生;所谓“自动校正”其实是封装成高阶函数后复用逻辑
- 例如:
obj.method.apply(obj, [a, b])确保method中的this是obj
封装 bind-like 工具函数
可以基于 apply 写一个简易的 bind 替代:
function bind(fn, context) {
return function(...args) {
return fn.apply(context, args);
};
}
这样就实现了类似 fn.bind(obj) 的效果,后续调用无论怎么传,this 都固定为 context。
- 返回的新函数内部每次调用都用
apply强制绑定this - 支持柯里化:可在
bind时预填部分参数,再通过apply合并后续参数 - 比直接写
fn.apply(obj, args)更简洁,适合多次复用
和 call、bind 的对比要点
apply 和 call 功能一致,区别只在参数传递形式(数组 vs 列表),而 bind 返回新函数不立即执行。
- 想立刻执行并绑定
this→ 选apply或call - 想生成一个长期绑定
this的函数 → 用bind,或自己用apply封装 - 箭头函数无法用
apply改变this,因为它没有自己的this绑定
实际修复示例
比如按钮点击中方法 this 丢失:
const user = {
name: 'Alice',
greet() { console.log(`Hello, ${this.name}`); }
};
// ❌ 错误:greet 单独取出后 this 指向 undefined
button.addEventListener('click', user.greet); // 输出 "Hello, undefined"
// ✅ 正确:用 apply 封装后绑定
button.addEventListener('click', function() {
user.greet.apply(user);
});
// ✅ 或更简洁:用 bind(底层也依赖 apply/call)
button.addEventListener('click', user.greet.bind(user));
本质上,所有手动绑定方案都靠 apply 或 call 实现底层 this 控制。











