call方法立即执行函数并显式指定this值,首参为this绑定对象(null/undefined在非严格模式下转window),后续参数依次传入原函数;与apply(数组传参)、bind(返回绑定函数)不同,且无法改变箭头函数this。

call 方法的核心作用是**立即执行函数,并显式指定该函数运行时的 this 值**,同时支持逐个传入参数。它的参数传递机制有明确规则,理解细节对避免常见错误很关键。
第一个参数:this 绑定目标
call 的第一个实参就是函数体内 this 将指向的对象。如果传入 null 或 undefined,在非严格模式下会自动转为全局对象(浏览器中是 window),严格模式下则保持 null/undefined 不变。
-
func.call(obj, a, b)→func内部的this === obj -
func.call(null, 1, 2)→ 非严格模式下this === window;严格模式下this === null - 不传第一个参数(即
func.call())等价于func.call(undefined)
后续参数:按顺序传给原函数
call 的第二个及以后的参数,会**依次对应原函数声明中的形参位置**,不打包、不合并、不自动转换。
function sum(x, y, z) { return x + y + z; }-
sum.call(null, 1, 2, 3)→ 返回6(x=1, y=2, z=3) -
sum.call(null, 1, 2)→z为undefined,结果是NaN - 不能用数组直接代替多个参数,
sum.call(null, [1,2,3])只传了一个数组给x
与 apply 和 bind 的关键区别
三者都可改 this,但参数处理不同:
立即学习“Java免费学习笔记(深入)”;
-
call(obj, a, b, c):参数逐个列出 -
apply(obj, [a, b, c]):第二个参数必须是数组(或类数组),元素被展开为实参 -
bind(obj, a, b):返回新函数,不立即执行;后续调用时还可追加参数,且this和初始参数永久绑定
实际使用中的注意事项
容易出错的地方往往藏在细节里:
- 箭头函数没有自己的
this,call 无法改变其this(始终继承外层作用域) - 若原函数是构造函数,一般不用 call 调用,应使用
new - 借用原生方法时注意兼容性,例如
Array.prototype.slice.call(arguments)是早期常用写法 - ES6 后推荐用扩展运算符替代 call+数组:
Math.max(...arr)比Math.max.apply(null, arr)更简洁










