javascript中的apply、call和bind
Published on Jul 30, 2025, with 16 view(s) and 0 comment(s)
Ai 摘要:JavaScript中的`apply`、`call`和`bind`方法用于改变函数的`this`指向并传递参数。`call`和`apply`会立即调用函数,区别在于参数形式:`call`接收参数列表,`apply`接收参数数组。`bind`则不会立即调用,而是返回一个绑定`this`的新函数,支持预设参数。`call`和`apply`返回函数执行结果,而`bind`返回绑定后的函数。这些方法在处理对象方法调用或参数传递时非常实用。

在 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]); // 5

bind():不会立即调用,返回一个新函数

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?