在 JavaScript 中,apply、call 和 bind 都是函数对象的方法,用来改变函数的 this 指向,也可以在调用时传入参数。它们之间的核心区别主要体现在:调用方式和返回结果。
| 方法 | 是否调用函数 | 参数形式 | 返回值 |
|---|---|---|---|
| call | 立即调用 | 参数列表 | 函数执行结果 |
| apply | 立即调用 | 参数数组 | 函数执行结果 |
| bind | 不调用函数 | 参数列表 | 绑定后的新函数 |
call():立即调用,参数是列表
function sayHi(age) {
console.log(this.name + " is " + age + " years old");
}
const person = { name: "Alice" };
sayHi.call(person, 25); // Alice is 25 years old- this 被设置为 person。
- 参数 25 直接传入。
- 函数被立即执行。
apply():立即调用,参数是数组
sayHi.apply(person, [30]); // Alice is 30 years old- 与 call 类似,立即调用函数,但参数是以数组形式传入。
适用于参数数量不确定时,或已有数组数据:
Math.max.apply(null, [1, 3, 5, 2]); // 5bind():不会立即调用,返回一个新函数
const boundSayHi = sayHi.bind(person, 35);
boundSayHi(); // Alice is 35 years old- 返回一个新函数,this 永远绑定为 person。
- 可预设参数,后续也可继续传参。
实用对比示例
示例函数
function greet(greeting, punctuation) {
console.log(`${greeting}, ${this.name}${punctuation}`);
}
const user = { name: "Tom" };
// call
greet.call(user, "Hello", "!"); // Hello, Tom!
// apply
greet.apply(user, ["Hi", "."]); // Hi, Tom.
// bind
const greetTom = greet.bind(user, "Hey");
greetTom("?"); // Hey, Tom?