JavaScript中的bind、call、apply有什么区别?如何手写实现一个bind方法?

8 min read

bindcallapply都是用来改变JavaScript中函数的this指向的方法,它们的主要区别如下:

  1. callapply的作用是立即调用一个函数,并将指定的this值和参数传递给该函数。它们之间唯一的区别在于传递参数的方式:call方法的参数是直接用逗号分隔列出的,而apply方法的参数则是以数组的形式传入的。
  2. bind方法的作用是创建一个新函数,称为绑定函数。当调用这个绑定函数时,它会以指定的this值来调用原函数,并将指定的参数传递给原函数。与callapply不同的是,bind方法不会立即调用原函数,而是返回一个新的函数。

以下是一个简单的bind函数的实现:

Function.prototype.bind2 = function (context, ...args) {
  const fn = this;
  return function (...newArgs) {
    fn.apply(context, [...args, ...newArgs]);
  };
};

在这个实现中,我们首先保存原始函数的引用fn,然后返回一个新的函数。当新函数被调用时,它会首先调用原始函数,并将传入的contextargs参数与调用新函数时传入的参数合并,并传递给原始函数。这样我们就实现了一个bind函数,可以在需要时更改函数的this指向。