“call/apply”和“bind”的区别是什么?

32
var obj = {
   x: 81,
   getX: function() { 
     console.log( this.x) 
   }
};
var getX = obj.getX.bind(obj);//use obj as 'this';
getX();//81
var getX = function(){
  obj.getX.apply(obj); 
}
getX();//also 81

使用bind和call/apply看起来非常相似,我想知道它们之间有什么区别。上面的两个getX函数是相同的吗?


请查看以下链接以了解call和apply的区别:https://dev59.com/_nI-5IYBdhLWcg3wKVA9 或 https://dev59.com/UGUp5IYBdhLWcg3wLlRV - Rakesh
3个回答

38

bind方法返回一个函数,该函数类似于原始函数,但其中的this已经预先定义好了。通常在您想要将函数传递给事件处理程序或其他异步回调时使用。

callapply会立即调用函数,让您可以指定this的值以及函数将接收到的任何参数。

您的第二个示例定义了一个匿名函数,该函数调用apply。这是一种常见模式;bind提供了一个标准实现,使您可以通过简单的函数调用来执行它(因此更快,更容易编写)。


4
另外,在 bind() 调用中,您可以指定参数,这些参数将在调用结果函数时添加到参数列表的前面,例如:function add(a,b){return a+b}; var plus5=add.bind(null,5); console.log(plus5(6) /*11*/) - thejh

34

.call() - 使用指定的参数调用相同的函数。

.apply() - 使用在数组中指定的参数调用相同的函数。

.bind() - 创建一个新的函数,使用相同的函数体,并预设 this 的值(第一个参数),并返回该函数。

在所有情况下,第一个参数都被用作函数内部的 this 值。


1
怎么能谈论callapplybind而不讨论this呢? - T.J. Crowder
@T.J.Crowder - 我也加上了那一部分.. :) - techfoobar
bind() 不会调用函数。请考虑重新表述。 - lqc
我喜欢这个代码的简短和简单! - emran
完全通过了橡皮鸭测试 - HipsterZipster

5

区别就在于如何进行调用。如果你使用 bind 来获取一个带有绑定 this 值的函数,那么你只需要调用这个函数:

getx();

如果您没有绑定的函数, 并且想要设置 this, 您可以使用 callapply:
someFunction.call(objectToUseAsThis, arg1, arg2);
// or
someFunction.apply(objectToUseAsThis, [arg1, arg2]);

请注意,如果您有一个绑定的函数(如您的 getX ),在其上使用 call 是无意义的,因为您提供的 this 将被绑定的 this 覆盖。 (如果您有要作为参数添加的值数组,则仍可以使用 apply 。)

apply 并不是无意义的,因为你可能有一个参数数组,而你不能直接调用它。 - Neil
@Neil:好的,说得对。 - T.J. Crowder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接