在 JavaScript 中,apply、call 和 bind 都是函数对象的方法,用来改变函数的 this 指向,也可以在调用时传入参数。它们之间的核心区别主要体现在:调用方式和返回结果。

call():立即调用,参数是列表

function sayHi(age) {
  console.log(this.name + " is " + age + " years old");
}

const person = { name: "Alice" };
sayHi.call(person, 25); // Alice is 25 years oldthis 被设置为 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?