返回

知悉手写Call、Apply、Bind,是2020程序员的必备技能

前端

Call、Apply、Bind:全面理解函数调用方式

在 JavaScript 中,Call、Apply 和 Bind 是强大的函数调用方式,可让你控制函数的上下文和参数传递。理解这些方法至关重要,可以帮助你灵活地使用函数并创建动态代码。

Call vs Apply

CallApply 都是立即调用的方法,这意味着它们在调用时立即执行函数。主要区别在于传递参数的方式:

  • Call 接受参数列表作为其第二个参数。
  • Apply 接受一个包含参数的数组作为其第二个参数。
const obj = { name: 'John' };

function greet(greeting) {
  console.log(`${greeting}, ${this.name}!`);
}

// 使用 Call 传递参数
greet.call(obj, 'Hello'); // 输出: Hello, John!

// 使用 Apply 传递参数
greet.apply(obj, ['Good morning']); // 输出: Good morning, John!

Bind

Bind 与 Call 和 Apply 不同,它不会立即调用函数。相反,它返回一个新的函数,该函数被绑定到指定的对象。这允许你稍后在不同的上下文中调用函数。

const boundGreet = greet.bind(obj);

// 稍后调用绑定的函数
boundGreet('Hey'); // 输出: Hey, John!

比较表

特性 Call Apply Bind
立即调用
参数传递 参数列表 参数数组
返回值 函数返回值 函数返回值 绑定函数

何时使用 Call、Apply、Bind

  • Call :当你想立即调用函数并指定一个特定的调用者时,使用 Call。
  • Apply :当你想立即调用函数并传入一个参数数组时,使用 Apply。
  • Bind :当你想创建一个在不同上下文中调用的新函数时,使用 Bind。

代码示例

// 创建一个新的对象
const person = { name: 'Jane' };

// 定义一个函数来打招呼
function sayHello(greeting) {
  console.log(`${greeting}, ${this.name}!`);
}

// 使用 Call 绑定并调用函数
sayHello.call(person, 'Hello'); // 输出: Hello, Jane!

// 使用 Apply 绑定并调用函数
sayHello.apply(person, ['Good morning']); // 输出: Good morning, Jane!

// 使用 Bind 创建一个绑定的函数
const boundHello = sayHello.bind(person);

// 稍后调用绑定的函数
boundHello('Hey'); // 输出: Hey, Jane!

常见问题解答

1. 什么时候应该使用 Call 和 Apply?
当需要立即调用函数并控制调用者和参数传递时。

2. Bind 有什么好处?
Bind 允许你创建在不同上下文中调用的函数,提高代码的可重用性和灵活性。

3. Call 和 Apply 的参数列表有什么区别?
Call 接受参数列表,而 Apply 接受包含参数的数组。

4. Bind 绑定的是什么?
Bind 绑定的是函数的 this 。

5. 如何在箭头函数中使用 Call、Apply 或 Bind?
箭头函数没有自己的 this 关键字,因此无法使用这些方法。