面试官 : “ 请你说一下 call、apply、bind 的区别 ? ”

206 阅读1分钟

call、apply、bind 的核心区别

这三个方法的作用都是改变函数的 this 指向,他们三个的第一个参数是要绑定给函数的 this 对象。但在传参方式和执行时机上有明显不同。


详细对比

特性callapplybind
this 绑定后是否立即执行立即执行立即执行返回一个新函数,需手动调用才执行
传参方式逐个传递参数以数组形式传递参数预先传递部分参数(柯里化),剩余参数在调用时传递
返回值函数执行结果函数执行结果新的绑定函数

代码示例

1. call 用法

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

const obj = { greeting: 'Hello' };
greet.call(obj, 'Alice'); // 输出:Hello, Alice!

2. apply 用法

function sum(a, b) {
  return a + b;
}

const numbers = [1, 2];
const result = sum.apply(null, numbers); // 输出:3

3. bind 用法

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

const obj = { greeting: 'Hi' };
const boundGreet = greet.bind(obj);
boundGreet('Bob'); // 输出:Hi, Bob!

核心场景

  • call:适合参数数量明确的场景,如继承、借用方法。
  • apply:适合参数数量不确定或已存在数组的场景,如数组求最大值 Math.max.apply(null, [1, 2, 3])
  • bind:适合需要延迟执行或预先绑定 this 的场景,如事件回调、定时器。

这三个方法的作用都是改变函数的 this 指向,call , apply , bind 他们三个的第一个参数是要绑定给函数的 this 对象。