call和apply的核心作用是临时改变函数执行时的this指向;call逐个传参,apply以数组形式传参,二者功能相同仅参数传递方式不同。

JavaScript 中 call 和 apply 的核心作用,是临时把一个函数“借给”另一个对象执行,让 this 指向你指定的对象——这不是永久绑定,而是“这一次执行时,this 就是你给的那个对象”。
call:逐个传参,适合参数确定且数量少
call 的第一个参数是函数体内 this 的指向,后续参数按顺序一一传入函数。
例如:
function introduce(age, city) {
console.log(`我是${this.name},${age}岁,住在${city}`);
}
const person = { name: '小明' };
introduce.call(person, 25, '杭州'); // 我是小明,25岁,住在杭州
常见用法:
- 借用数组方法处理类数组对象(如
arguments、NodeList):Array.prototype.slice.call(arguments)把arguments转成真数组 - 实现继承时调用父构造函数:
Parent.call(this, name, age)让子构造函数执行父构造函数逻辑,同时让this指向新实例
apply:传入参数数组,适合参数动态或数量不定
apply 的第一个参数同样是 this 指向,第二个参数必须是一个数组(或类数组),它会把数组元素展开为实参传入。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
例如:
const nums = [3, 7, 1, 9]; Math.max.apply(null, nums); // 9 // 等价于 Math.max(3, 7, 1, 9)
实用场景:
- 求最值:
Math.min.apply(null, arr)或Math.max.apply(null, arr) - 批量调用函数并统一指定
this:fn.apply(context, argsList),尤其适合封装通用执行器 - 合并两个数组:
arr1.push.apply(arr1, arr2)(虽现代更常用arr1.push(...arr2),但原理相通)
call 和 apply 的本质区别就一条
它们功能完全一致,唯一差异在于传参方式:call 是“散列传参”,apply 是“数组传参”。
所以什么时候用哪个,只取决于你手上的参数是单独变量,还是已经在一个数组里。
比如你有 const args = [a, b, c],那就用 fn.apply(obj, args);
如果你直接写得出参数,比如 fn.call(obj, a, b, c) 更清晰直观。
现代替代方案:bind 和展开运算符
bind 返回一个新函数,this 和部分参数被预设好,适合需要复用的场景:const boundFn = fn.bind(obj, 'fixedArg');
ES6 后,参数展开更简洁:fn.call(obj, ...args) 效果等同于 fn.apply(obj, args);fn(...args) 配合箭头函数或严格模式下 this 明确时,也常替代传统 call/apply。
不过在需要兼容老环境、操作类数组、或动态控制 this 的底层逻辑中,call 和 apply 依然不可替代。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










