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

4

3 回答 3

39

bind返回一个函数,该函数的作用类似于原始函数,但具有this预定义。当您想要将函数传递给事件处理程序或其他异步回调时,通常使用它。

call并将apply立即调用一个函数,让您指定this函数将接收的值和任何参数。

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

于 2013-03-28T09:02:31.360 回答
34

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

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

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

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

于 2013-03-28T09:02:57.647 回答
5

不同之处在于您拨打电话的方式。如果您曾经使用bind绑定值取回函数this,则只需调用该函数:

getx();

如果您没有绑定函数,并且想要设置this,请使用callor执行此操作apply

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

请注意,如果你有一个绑定函数(比如你的getX),使用call它是没有意义的,因为this你提供的只会被 bound 覆盖this。(使用apply可能仍然有用,如果你有一个值数组你想作为参数。)

于 2013-03-28T09:03:15.887 回答