我什么时候应该使用call()vs直接调用函数?

时间:2011-10-19 17:46:50

标签: javascript unobtrusive-javascript

我有一个使用大量回调的JavaScript应用程序。一个典型的函数将进行回调,并用另一个回调包装它。

Namespace.foo = function( arg, their_on_success ) {
    var my_on_success = function( result ) {
        console.log( 'my_on_success() called' );
        if( 'function' === typeof their_on_success ) {
              their_on_success( result );
        }
    }
    something( arg, my_on_success );
};

鉴于上面的示例,何时应该使用本地call()方法(将结果var作为第二个参数传递)而不是调用their_on_success()并通过函数调用传递结果? / p>

6 个答案:

答案 0 :(得分:19)

call()用于更改函数的 this 值:

var obj = {a: 0};
method.call(obj, "parameter");
function method(para) {
    this.a == 0; // true <-- obj is now this
}

答案 1 :(得分:7)

使用call(或apply)的唯一原因是,如果要在函数内设置this的值。

嗯,我猜apply在其他情况下很有用,因为它接受一系列参数。

答案 2 :(得分:3)

使用函数的call()方法允许您在函数执行期间将绑定到函数的对象更改为this - 这也称为 context < / p>

their_on_success.call(myContext, results)

但是,如果您的回调函数不依赖于this,那么您调用它的方式没有区别。

答案 3 :(得分:3)

一个很好的例子是在实现需要回调的函数时。在编写OO代码时,您希望允许调用者指定将调用回调的上下文。

function validateFormAjax(form, callback, context) {
  // Using jQuery for simplicity
  $.ajax({
    url: '/validateForm.php',
    data: getFormData(form),
    success: function(data) {
      callback.call(context, data);
    }
  });
}

请注意,我的示例可以通过将context参数传递给$.ajax调用来实现,但这对于使用call

没有太多帮助

答案 4 :(得分:1)

使用call()的另一种情况是,当您处于一个您无法信任该对象的环境中时,您自己的方法还没有被替换,或者您知道它实际上并没有有你想要在它上面运行的方法。 hasOwnProperty通常是这样一种方法 - 有很多地方javascript对象可能没有自己的hasOwnProperty方法,所以调用它作为hasOwnProperty.call(obj,propertyName)是谨慎的。

答案 5 :(得分:0)

我经常使用“调用”的一种情况是拼接参数:

const fn = function() {
    const args = Array.prototype.slice.call(arguments, 0);
    console.log(args);
}

请注意,参数是一个对象。 args是一个数组。