2011-10-19 53 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')'來讓你的代碼是防彈的。 –

相關問題