call和apply都显式绑定this并立即执行函数,区别仅在参数传递形式:call逐个传参,apply以数组传参;二者thisarg处理规则、执行时机及返回值行为完全一致。

call 和 apply 都用于显式绑定 this 并立即执行函数,核心区别只在参数传递形式上,其他行为完全一致。
call:参数逐个列出
语法是 fn.call(thisArg, arg1, arg2, arg3, ...)。第二个及之后的每个实参都独立传入,按位置一一对应函数形参。
- 适合参数数量固定、已知的场景
- 例如:
greet.call(person, 'Hi', '!')→ 传两个字符串参数 - 若参数来自变量,需手动拆解:
call(obj, a, b, c)
apply:参数打包成数组(或类数组)
语法是 fn.apply(thisArg, [arg1, arg2, arg3]) 或 fn.apply(thisArg, arguments)。第二个参数必须是数组或类数组对象,内部自动展开为实参。
一款AI图像与设计工具,主要用于基于TRIZ理论的AI工程创新平台,为工程师提供复杂机械机理实时渲染、物理级运动仿真、矛盾矩阵求解及AI创新灵感生成,适合需要提升相关任务效率的用户。
- 适合参数动态生成、数量不确定的场景
- 例如:
Math.max.apply(null, [3, 7, 1])→ 把数组“摊开”传给 Math.max - 经典用途:让类数组对象调用数组方法,如
Array.prototype.slice.call(arguments)
thisArg 的处理规则相同
两者第一个参数都是 this 绑定目标,规则完全一致:
- 传
null或undefined:非严格模式下指向全局对象(如 window),严格模式下保持原值 - 传原始值(如字符串、数字):非严格模式下自动包装为对应对象(
'a'→String{'a'}),严格模式下不转换 - 不传第一个参数:等同于传
undefined
执行时机与 this 锁定效果也一样
二者都是立即调用函数,且 this 绑定仅对当次生效,不影响函数本身或其他调用。
- 执行后返回函数本身的返回值
-
fn.call(obj)执行完,再写fn(),this 仍按默认规则确定 - 都不是“永久重绑定”,要多次复用同一 this,应选 bind










