call和apply都能强制指定函数执行时的this值并立即调用;区别仅在于传参形式:call用逗号分隔参数,apply用数组传参。

call 和 apply 都能**强制指定函数执行时的 this 值**,并立即调用函数;区别只在传参形式:call 用逗号逐个传,apply 用数组一次性传。
它们怎么改变 this 指向
函数内部的 this 默认由调用方式决定(比如 obj.fn() 中 this 是 obj,独立调用时是全局对象或 undefined)。call/apply 不看调用位置,而是**直接把第一个参数设为本次执行的 this**:
- 传普通对象(如
{name: 'Tom'})→ 函数内 this 就指向这个对象 - 传
null或undefined→ 非严格模式下 this 指向window(浏览器),严格模式下就是null/undefined - 传基础类型(如
123、'abc')→ 自动包装成对应对象(Number、String实例)
传参方式的区别
核心差异就在这里,其余完全一致:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
-
call:第二个参数起,每个实参单独列出,按顺序传入
fn.call(obj, 'a', 'b', 10)→fn('a', 'b', 10) -
apply:第二个参数必须是数组(或类数组,如
arguments),数组元素被展开为实参fn.apply(obj, ['a', 'b', 10])→ 效果等同于上面的 call
典型使用场景
选哪个主要看参数来源是否天然是数组:
- 用 apply:求数组最值、合并数组、借用数组方法处理类数组(如
Array.prototype.push.apply(arr1, arr2)) - 用 call:构造函数继承(
Parent.call(this, a, b))、明确参数语义时更易读 - 参数数量不确定 → 优先用 apply,避免手动拆解
一个小提醒
两者都不修改原函数,只是“临时借用”一次:执行完 this 和参数的作用就结束,不影响后续调用。如果需要长期绑定 this,得用 bind。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










