apply的核心作用是显式指定this并传入数组作为参数列表,适用于将数组展开为多个独立参数的场景,如Math.max.apply(null, [1,2,3]),也支持类数组对象且在构造函数调用和上下文控制上仍有不可替代性。

apply 方法的核心作用是显式指定 this 并把一个数组(或类数组)作为参数列表传入函数,特别适合“把数组元素当多个独立参数用”的场景。
用 apply 把数组展开为函数参数
当目标函数接受多个独立参数,而你手头只有数组时,apply 是最直接的解法。它自动将数组每一项映射为函数调用时的一个实参。
-
Math.max(1, 2, 3)正确;Math.max([1, 2, 3])返回NaN - 正确写法:
Math.max.apply(null, [1, 2, 3])→3 - 等价于手动展开:
Math.max(1, 2, 3),但无需预先知道数组长度
在构造函数中用 apply 实现数组参数实例化
普通构造函数不支持直接用 new Fn(...args)(ES6 才有 spread),但可用 apply 曲线救国:
- 先用
Object.create(Fn.prototype)创建空实例 - 再用
Fn.apply(instance, args)绑定this并初始化属性 - 示例:
function Person(name, age) { this.name = name; this.age = age; }const args = ['Alice', 30];const p = Object.create(Person.prototype);Person.apply(p, args);
替代方案:ES6 的 spread 更简洁,但 apply 仍有不可替代性
现代代码中,func(...arr) 基本可替代 func.apply(this, arr),但注意两点:
- spread 不能用于构造函数调用(
new Fn(...arr)在 ES6+ 是合法的,但旧环境不支持) - apply 支持传入
null或undefined作为this,且明确控制上下文,逻辑更透明 - 类数组对象(如
arguments、NodeList)需先转数组才能用 spread,而 apply 可直接传入
常见陷阱与规避方式
使用 apply 时容易忽略细节导致错误:
-
thisArg为null或undefined时,非严格模式下会指向全局对象(浏览器中是window),建议显式传this或用Object.prototype - 第二个参数必须是数组或类数组;传字符串会被拆成字符数组,传对象可能报错
- 避免嵌套 apply:如
fn.apply(this, arr1).apply(this, arr2)是错误写法,应先合并参数再调用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











