JavaScript中apply用于显式绑定this并展开数组为参数,语法为func.apply(thisArg, [argsArray]),区别于call的逐个传参,适用于参数已为数组的场景,ES6后推荐用扩展运算符替代但apply在兼容性和类数组处理上仍有不可替代性。

JavaScript 中用 apply 实现显式绑定,核心是把数组“展开”为函数的参数列表,同时指定 this 值。
apply 的基本语法和作用
func.apply(thisArg, [argsArray]) 接收两个参数:第一个是函数执行时的 this 值,第二个必须是数组(或类数组对象)。它会把数组里的每一项当作独立参数传给函数。
- 和
call的区别在于:call要求参数逐个列出,apply接收一个数组统一传入 - 适用于你已经有一个参数数组,又想控制
this的场景(比如借用方法、批量调用)
常见用法示例
比如有一个求最大值的函数,但 Math.max() 不接受数组:
const numbers = [3, 7, 1, 9, 4]; const max = Math.max.apply(null, numbers); // 9
这里 null 表示不关心 this(Math.max 是纯函数),numbers 数组被展开成 Math.max(3, 7, 1, 9, 4)。
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
再比如借用数组方法处理类数组:
function sum() {
return Array.prototype.reduce.call(arguments, (a, b) => a + Number(b), 0);
}
// 用 apply 更简洁:
function sum() {
return Array.prototype.reduce.apply(Array.prototype, [arguments, (a, b) => a + Number(b), 0]);
}
配合 bind 实现预设 this 和部分参数
apply 本身不返回新函数,但可以和 bind 搭配实现“固定 this + 动态传参”:
- 先用
bind固定this和前几个参数 - 再用
apply把剩余参数数组传进去
例如:
const obj = { base: 10 };
function add(a, b, c) {
return this.base + a + b + c;
}
const boundAdd = add.bind(obj, 1); // this 固定为 obj,a 固定为 1
const result = boundAdd.apply(null, [2, 3]); // 相当于 add.call(obj, 1, 2, 3) → 16
注意点和替代方案
ES6+ 推荐优先使用扩展运算符(...)代替 apply 处理数组传参,更直观:
-
Math.max(...numbers)替代Math.max.apply(null, numbers) -
func(...args)替代func.apply(thisVal, args)
但 apply 在需要动态控制 this 且参数已是数组时仍不可替代,尤其在兼容老环境或操作类数组对象时。

















