apply方法通过数组或类数组对象一次性传入多个参数,本质是将数组“展开”为独立实参;其语法为func.apply(thisarg, [argsarray]),第一个参数指定this指向,第二个参数必须是数组或类数组对象。

apply 方法通过第二个参数(数组或类数组)一次性传入多个参数,本质是把数组“展开”成独立实参。
apply 的基本语法和参数含义
apply 的调用形式是 func.apply(thisArg, [arg1, arg2, ...])。它接收两个参数:
- 第一个参数:指定函数内部
this的指向; - 第二个参数:必须是数组(或类数组对象,如
arguments、NodeList),其中每个元素会被当作函数的独立实参依次传入。
为什么用 apply 传数组而不是 call
call 方法要求你把每个参数逐个列出,比如 func.call(obj, a, b, c);而当你手头只有一个参数数组(例如 const args = [1, 2, 3]),直接用 call 就得写成 func.call(obj, args[0], args[1], args[2]),不灵活也不可扩展。apply 则天然适配这种场景:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
func.apply(obj, args)—— 简洁、动态、无需预知参数个数; - 特别适合代理调用、函数柯里化、批量处理等场景。
实际使用中的常见写法和注意事项
注意以下几点能避免典型错误:
- 第二个参数必须是数组或类数组;传入普通对象或
null/undefined会报错(除非函数本身不依赖参数); - 空数组
[]表示不传任何参数,等价于func.apply(obj, []); - ES6 后可用扩展运算符替代,如
func(...args),但 apply 在需要动态指定this时仍不可替代; - 浏览器中
Math.max.apply(null, [1, 2, 3])是经典用例,因为Math.max不支持数组直接入参。
兼容类数组对象的用法
apply 的第二个参数不限于真数组,也接受类数组(有 length 属性和数字索引的对象):
-
Array.prototype.slice.apply(arguments)是早期模拟数组化arguments的常用技巧; -
Array.prototype.forEach.apply(nodelist, [...])可让NodeList复用数组方法(现代更推荐[...nodelist].forEach())。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










