apply和call功能完全一致,核心区别仅在参数格式:call逐个传参(func.call(thisarg, arg1, arg2)),apply以数组传参(func.apply(thisarg, [arg1, arg2]))。

apply 和 call 的核心区别就在参数格式上,其他功能完全一致。
call:参数逐个列出
call 方法要求把所有实参(除第一个外)一个一个写出来,用逗号分隔:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 语法:
func.call(thisArg, arg1, arg2, arg3, ...) - 第一个参数是 this 指向的对象
- 后续每个参数都独立传入,位置和函数形参一一对应
- 例如:
Math.max.call(null, 1, 5, 3)→ 返回5
apply:第二个参数必须是数组或类数组
apply 只接收两个参数,第二个参数必须是数组(或 arguments 等类数组对象):
- 语法:
func.apply(thisArg, [arg1, arg2, arg3]) - 数组里的每一项,会按顺序作为独立实参传给目标函数
- 即使只有一个参数,也得包成数组,比如
func.apply(obj, ['hello']) - 例如:
Math.max.apply(null, [1, 5, 3])→ 同样返回5
什么时候该用哪个?
看参数来源是否已组织成数组:
- 参数已存在数组里(比如从用户输入、API 响应或
arguments中收集的),直接用apply - 参数数量固定、变量明确,用
call更直观 - ES6 后,
func(...args)扩展运算符可替代多数apply场景,但apply在需要动态调用且兼容老环境时仍有价值
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










