2011-10-19 54 views
13

我有一个使用大量回调的JavaScript应用程序。一个典型的函数将采取回调,并用另一个回调包装它。什么时候应该使用call()直接调用该函数?

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()和通过功能调用在结果传递?

回答

19

()调用来改变值的函数:

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

的唯一原因使用call(或apply)是,如果你想设置的功能,里面的this值。

嗯,我猜apply可以在其他情况下有用,因为它接受参数数组。

+1

'apply'的主要情况是在处理可变参数时,所以你可以传递'arguments'给它。 –

3

使用功能的call()方法允许你改变这就是函数的执行过程中绑定到功能this对象 - 这也被称为背景

their_on_success.call(myContext, results) 

但是,如果你的回调函数并不取决于this,你调用它的方式没有区别。

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); 
    } 
    }); 
} 

请注意,我的例子中可以只通过上下文参数传递给$.ajax调用来实现,但这并不多告诉你如何使用call

1

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

+1

我明白你的意思,但我认为它可以得到改善。像这样:JavaScript可以让你根本不指定任何原型('Object.create(null)'),覆盖原生对象原型的属性,甚至覆盖对象本身。因此,为了安全起见,你应该使用Object.prototype.hasOwnProperty.call(obj,'someProp')'来让你的代码是防弹的。 –

相关问题