'call / apply'和'bind'之间的区别是什么?

时间:2013-03-28 09:00:29

标签: javascript function call bind apply

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函数是一样的吗?

3 个答案:

答案 0 :(得分:37)

bind返回一个函数,它将像原始函数一样,但预定义为this。当您想要将函数传递给事件处理程序或其他异步回调时,通常会使用它。

callapply会立即调用一个函数,让您同时指定this的值和函数将接收的任何参数。

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

答案 1 :(得分:33)

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

.apply() - 使用数组

中指定的参数调用相同的函数

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

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

答案 2 :(得分:5)

区别在于您如何拨打电话。如果您使用bind来获取具有绑定this值的函数,则只需调用该函数:

getx();

如果您没有绑定功能,并且想要设置this,则可以使用callapply执行此操作:

someFunction.call(objectToUseAsThis, arg1, arg2);
// or
someFunction.apply(objectToUseAsThis, [arg1, arg2]);

请注意,如果您有一个绑定函数(例如getX),则使用call是没有意义的,因为您提供的this将被绑定{this覆盖1}}。 (如果你想要作为参数使用一组值,那么使用apply可能仍然有用。)