call是JavaScript中实现显式绑定的核心方法,能立即调用函数并手动指定this指向及传参;语法为func.call(thisArg, arg1, arg2...),支持null/undefined/原始值作为thisArg,且优先级高于隐式和默认绑定但低于new绑定。

call 是 JavaScript 中实现显式绑定(explicit binding)的核心方法,它能立即调用函数,并手动指定该函数内部 this 的指向,同时支持传入参数。
call 的基本语法和作用
调用形式为:func.call(thisArg, arg1, arg2, ...)。第一个参数决定函数执行时 this 绑定的对象;后续参数会依次传给函数本身。
- 如果
thisArg是null或undefined,非严格模式下this指向全局对象(如浏览器中的window),严格模式下保持null/undefined不变 - 若
thisArg是原始值(如字符串、数字),会被自动包装成对应对象(如"abc"→new String("abc")) - 函数会立刻执行,不是返回新函数(这点区别于
bind)
常见使用场景举例
比如有一个通用工具方法,想临时借用到不同对象上:
function introduce(age) {
console.log(`我是${this.name},今年${age}岁`);
}
const person1 = { name: '张三' };
const person2 = { name: '李四' };
introduce.call(person1, 25); // 我是张三,今年25岁
introduce.call(person2, 30); // 我是李四,今年30岁
再比如借用数组方法处理类数组对象:
立即学习“Java免费学习笔记(深入)”;
function sum() {
// arguments 是类数组,没有 reduce 方法
return Array.prototype.reduce.call(arguments, (a, b) => a + Number(b), 0);
}
sum(1, 2, 3); // 6
与 apply 和 bind 的关键区别
三者都用于显式绑定 this,但行为不同:
-
call:立即执行,参数逐个列出 -
apply:立即执行,参数以数组形式传入(如func.apply(obj, [a,b])) -
bind:不执行,返回一个this已绑定的新函数,可 later 调用
注意 this 绑定优先级
显式绑定(call/apply/bind)的优先级高于隐式绑定(如 obj.method())和默认绑定,但会被 new 绑定覆盖。一旦函数被 new 调用,call 指定的 this 会被忽略。
function Foo() {
console.log(this);
}
const obj = { name: 'test' };
new (Foo.bind(obj)); // this 是新创建的实例,不是 obj


















