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

ben*_*ice 32 javascript bind function call 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
Run Code Online (Sandbox Code Playgroud)

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

Que*_*tin 38

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

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

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

  • 此外,您可以在`bind()`调用中指定参数,当您调用结果函数时,该参数将被添加到参数列表中,例如`function add(a,b){return a + b}; var plus5 = add.bind(null,5); console.log(plus5(6)/*11*/)` (4认同)

tec*_*bar 33

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

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

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

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


T.J*_*der 5

不同的是你打电话的方式.如果您曾经使用bind绑定this值返回一个函数,则只需调用该函数:

getx();
Run Code Online (Sandbox Code Playgroud)

如果您没有绑定功能,并且想要设置this,则使用call或执行以下操作apply:

someFunction.call(objectToUseAsThis, arg1, arg2);
// or
someFunction.apply(objectToUseAsThis, [arg1, arg2]);
Run Code Online (Sandbox Code Playgroud)

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