`call()` 和 `apply()` 都是 JavaScript 中用于调用函数的方法,它们的作用都是在特定的作用域中调用函数,并且可以指定函数的 this 指向。它们的区别在于传递参数的方式。
`call()` 方法允许你在指定的作用域中调用函数,并将参数作为单独的参数进行传递。例如:
function sayHello(message) {
console.log(`${message}, ${this.name}!`);
}
const person = {name: 'John'};
sayHello.call(person, 'Welcome'); // 输出:Welcome, John!
在上面的例子中,`call()` 方法将 `person` 对象作为 `sayHello()` 函数的执行环境,并将字符串 `'Welcome'` 作为参数传递给函数。
另一方面,`apply()` 方法允许你在指定的作用域中调用函数,并将参数作为数组进行传递。例如:
function sayHello(message, punctuation) {
console.log(`${message}, ${this.name}${punctuation}`);
}
const person = {name: 'John'};
sayHello.apply(person, ['Welcome', '!']); // 输出:Welcome, John!
在上面的例子中,`apply()` 方法将 `person` 对象作为 `sayHello()` 函数的执行环境,并将包含 `'Welcome'` 和 `'!'` 的数组作为参数传递给函数。
需要注意的是,当参数数量不确定时,使用 `apply()` 方法比 `call()` 方法更加方便。例如:
function sayHello() {
console.log(`Hello, ${this.name}!`);
}
const person = {name: 'John'};
sayHello.apply(person); // 输出:Hello, John!
在上面的例子中,`sayHello()` 函数没有定义任何参数,但是可以通过 `apply()` 方法将 `person` 对象作为执行环境,并且不需要传递任何参数。