call可立即指定函数执行时的this值,第一个参数为this绑定对象,后续参数依次传入;它属于显式绑定,优先级仅次于new,能覆盖隐式和默认绑定,但对箭头函数无效。

用 call 方法可以在函数执行那一刻,直接把 this 指向你指定的对象——不延迟、不封装、不预设,只做一件事:立刻以新上下文运行。
call 的基本用法和核心行为
call 是所有函数都具备的方法,调用时第一个参数就是你要强行绑定的 this 值,后面参数依次传给原函数。
- 语法是:
fn.call(thisArg, arg1, arg2, ...) -
thisArg会被强制作为函数体内this的值,哪怕它是null或undefined(非严格模式下会转成全局对象) - 函数立即执行,返回值就是原函数的执行结果,不是新函数
- 它不改变原函数,只是“借一次上下文”,下次调用还是按默认规则走
哪些场景最适合用 call 强行指定 this
当你需要临时切换执行环境,又不想提前绑定或改写函数定义时,call 是最轻量直接的选择。
-
处理类数组对象:比如把
arguments转成真数组:Array.prototype.slice.call(arguments) -
安全检测数据类型:避免实例重写
toString,用Object.prototype.toString.call([])得到"[object Array]" -
复用方法但换主体:比如让一个通用校验函数以不同用户对象为
this运行一次:validator.call(userA, 'email') -
事件或定时器中补救丢失的 this:在回调里临时拉回上下文,比存
const self = this更干净
call 对 this 的控制力有多强
call 属于显式绑定,在 this 四级优先级中排第二,仅低于 new。这意味着:
- 即使函数是通过
obj.method()形式调用的,只要内部用了call,最终this就听它的 - 它能覆盖隐式绑定(如点号调用)、也能覆盖默认绑定(如独立调用)
- 但对箭头函数无效——箭头函数没有自己的
this,call改不了它,它只继承外层词法作用域的this - 如果函数本身被
bind过,call仍可覆盖(硬绑定函数除外,那是bind返回的新函数,call无法再改)
注意几个容易出错的细节
看似简单,但几个边界情况常导致意外结果:
- 传
42或true当thisArg,会被自动包装成对应包装对象(new Number(42)、new Boolean(true)) - 非严格模式下传
null或undefined,this会变成全局对象;严格模式下就真是null或undefined -
call不支持柯里化(预设部分参数),要实现这个得用bind - 它不能用于箭头函数,调用也不会报错,但
this值完全不受影响











