call 和 apply 的核心作用是临时指定函数执行时的 this 值并立即调用,不修改函数或对象本身;call 逐个传参,apply 以数组传参;箭头函数和 bind 绑定的函数不受其影响。

JavaScript 中 call 和 apply 的核心作用不是“改变指针指向”,而是临时指定函数执行时的 this 值,并立即调用该函数。它们不修改函数本身或任何对象的内部引用,只是在调用那一刻,让函数体内的 this 指向你传入的第一个参数。
call 和 apply 的本质:控制 this 绑定时机
函数中的 this 默认取决于「谁调用它」,而 call/apply 能绕过默认规则,在调用时强行把 this 绑定到你指定的对象上。这不是永久修改,只对这一次调用生效。
- call(obj, arg1, arg2, ...):第一个参数是 this 目标对象,后续参数逐个传入函数
- apply(obj, [arg1, arg2, ...]):第一个参数同样是 this 目标对象,第二个参数必须是数组(或类数组),用于批量传参
常见使用场景举例
比如有一个通用方法想借给别的对象用:
const person = { name: '小明', age: 25 };
const logger = {
logInfo() {
console.log(`姓名:${this.name},年龄:${this.age}`);
}
};
logger.logInfo.call(person); // 输出:姓名:小明,年龄:25
logger.logInfo.apply(person); // 效果一样
这里 logInfo 原本属于 logger,但通过 call/apply,让它在 person 上下文中执行,this 就变成了 person。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
注意 this 绑定的优先级和限制
call/apply 的 this 绑定非常“强硬”,能覆盖多数默认行为,但有几点要留意:
- 箭头函数没有自己的
this,call/apply 对它无效,它始终继承外层作用域的this - 如果函数已用
bind绑定了 this,call/apply 无法覆盖(bind 的绑定优先级更高) - 严格模式下,传入
null或undefined作为 this,会真的让this是null/undefined;非严格模式下会被自动转为全局对象(如window)
怎么选 call 还是 apply?
关键看参数形式:
- 参数已知、数量固定 → 用 call,写法清晰
- 参数来自数组或需动态展开 → 用 apply,避免手动拆解
- ES6 后常用扩展运算符替代 apply:
func(...args)等价于func.apply(null, args)

















