call和apply的核心作用是立刻调用函数并手动指定当次执行的this指向;call逐个传参,apply以数组传参;二者不改变函数本身,仅影响当次调用上下文。

显式绑定 call 和 apply 的核心作用,就是**立刻调用函数,并手动指定该次执行中 this 指向哪个对象**。它们不改变函数本身,只影响当次调用的上下文。
call:逐个传参,立即执行并锁定 this
call 的第一个参数是 this 要绑定的对象,后续参数按顺序依次传入函数。
- 语法:
fn.call(thisArg, arg1, arg2, ...) - 如果
thisArg是null或undefined,非严格模式下指向全局对象(如window),严格模式下保持为null/undefined - 常用于借用方法,比如让类数组对象调用数组方法:
Array.prototype.slice.call(arguments)
apply:传入数组(或类数组),立即执行并锁定 this
apply 的第一个参数同样是 this 绑定对象,第二个参数必须是数组或类数组(如 arguments),它会把数组元素展开为实参。
- 语法:
fn.apply(thisArg, [arg1, arg2, ...]) - 适合参数数量不确定的场景,例如求最大值:
Math.max.apply(null, [1, 5, 3]) - 与
call功能一致,只是参数传递方式不同
对比 bind:call/apply 立即执行,bind 返回新函数
bind 也用于绑定 this,但它**不执行函数,而是返回一个绑定了 this(和部分参数)的新函数**;而 call 和 apply 是“调用即生效”。
-
obj.method.call(otherObj, 'a')→ 立刻执行,this指向otherObj -
const bound = obj.method.bind(otherObj, 'a')→ 不执行,需再调用bound() - 想立刻锁定并运行,就选
call或apply;想预设上下文留待 later 调用,才用bind
注意 this 锁定仅对当次有效
call 和 apply 只影响**当前这一次调用**的 this,不会改变原函数的定义,也不会影响后续独立调用时的 this 行为。
- 即使你写了
fn.call(obj),下一次直接写fn(),this还是按默认规则(如全局或undefined)确定 - 所谓“锁定”,是单次调用层面的强制指定,不是永久重绑定
- 若需多次复用同一
this,可配合bind,或封装成闭包










