call方法用于在指定this上下文中立即调用函数并传入逗号分隔参数,支持改变this指向、借用方法、构造函数继承等场景,但对箭头函数和bind绑定函数无效。

call 方法用于在指定的 this 上下文中调用函数,并可传入参数。
基本语法和作用
call 是函数对象的内置方法,格式为:func.call(thisArg, arg1, arg2, ...)。它立即执行函数,把第一个参数设为函数内部的 this 值,后续参数依次传给函数。
-
thisArg可以是任意值:对象、null、undefined、原始值(会被自动包装) - 如果
thisArg为null或undefined,非严格模式下this指向全局对象(如浏览器中是window),严格模式下保持null/undefined - 与
apply的区别在于参数传递方式:call接收逗号分隔的参数列表,apply接收一个数组
常见使用场景
改变函数执行时的 this 指向,解决上下文丢失问题。
-
借用其他对象的方法:比如让数组方法处理类数组对象
const arrayLike = {0: 'a', 1: 'b', length: 2};<br>Array.prototype.push.call(arrayLike, 'c');
此时push的this指向arrayLike,成功添加元素 -
继承构造函数:子构造函数中调用父构造函数初始化实例属性
function Parent(name) { this.name = name; }<br>function Child(name, age) { Parent.call(this, name); this.age = age; } -
临时绑定 this 并执行:避免箭头函数或回调中
this失效const obj = { value: 42 };<br>function log() { console.log(this.value); }<br>log.call(obj); // 输出 42
注意 this 绑定优先级
call 显式绑定的 this 优先级高于隐式绑定(如 obj.fn())和默认绑定,但低于 new 绑定和箭头函数的词法绑定。
- 普通函数用
call调用,this一定按传入值生效 - 箭头函数没有自己的
this,call无法改变其this(仍沿用外层词法作用域) - 已用
bind绑定过的函数,再用call也无法覆盖bind的this(除非 bind 时第一个参数是null或undefined且非严格模式)
简单示例对比
看一个容易混淆的例子:
const person = { name: 'Alice' };
function greet(greeting, punctuation) {
return `${greeting}, ${this.name}${punctuation}`;
}
greet.call(person, 'Hello', '!'); // "Hello, Alice!"
如果不传 thisArg(或传 undefined),非严格模式下 this 是全局对象,可能读不到 name;严格模式下 this 就是 undefined,访问 this.name 会报错。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











