call和apply的核心区别在于传参方式:call用逗号分隔参数,apply用数组传参;二者均用于临时改变this指向,且null/undefined在非严格模式下指向全局对象。

JavaScript 中 call 和 apply 都能临时改变函数执行时的 this 指向,核心区别在于传参方式不同:一个用逗号分隔,一个用数组。
call 改变 this 并逐个传参
call 的第一个参数是新的 this 值,后面所有参数按顺序传给目标函数。
- 语法:
func.call(thisArg, arg1, arg2, ...) - 适合已知参数个数、且参数明确的场景
- 例如:
getName.call(person, 'hello', 'world')表示以person为this调用getName,并传入两个字符串参数
apply 改变 this 并用数组传参
apply 的第一个参数也是新的 this 值,第二个参数必须是数组(或类数组对象),数组里的每一项作为参数依次传入。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 语法:
func.apply(thisArg, [arg1, arg2, ...]) - 适合参数动态生成、数量不确定的情况,比如借用
Math.max找数组最大值:Math.max.apply(null, [1, 5, 3]) - 注意:第二个参数必须是数组或
arguments这样的类数组,否则会报错
不传或传 null/undefined 时的 this 行为
在非严格模式下,如果 call 或 apply 的第一个参数是 null 或 undefined,this 会被自动绑定到全局对象(浏览器中是 window);严格模式下则保持为 null 或 undefined。
- 推荐显式传入
thisArg,避免依赖默认行为 - 想让函数内部
this指向全局,可写func.call(window)(浏览器环境)
常见用途和实际例子
它们不只是“改 this”,更是实现函数复用的关键工具。
- 借用方法:比如让类数组对象调用数组方法 —
Array.prototype.slice.call(arguments) - 继承构造函数:子构造函数中用
Parent.call(this, ...args)实现属性继承 - 事件回调中固定上下文,避免
this丢失 - 配合闭包或高阶函数做参数预设(类似
bind的简易实现)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










