2011-12-22 62 views
3

編輯:這個問題是由於我的誤解而被問到的。謹慎行事,因爲閱讀可能會浪費你的時間。僅在第一個參數上調用Javascript調用和應用函數?

我以爲callapply會執行一個給定一組參數的函數,但我得到了令人困惑的測試結果。看我的測試代碼:

window.z = 0; 
(function(){++(window.z)}).call(this, 1, 2, 3) 

我期望z在執行後爲3。但是,z是1.

(function(){++(window.z)}).apply(this, [1, 2, 3]) 

同樣在這裏。 z == 1;
我試着只需登錄輸入參數,以及:

var x = function(y){console.log(y);} 
x.call(this, 1, 2, 3); 

結果?僅記錄1個。
我在這裏做錯了什麼?

(在Chrome和Firefox測試使用Firebug。)

回答

6

兩個callapply只調用函數一次。區別在於如何傳遞調用的參數。

通過調用,上下文之後的每個參數(第一個參數)都是一個參數。通過apply,第二個參數應該是這樣的數組,如參數對象(第一個參數仍然提供上下文)。

function foo(a, b, c) { 

}; 

foo.call(this, 1, 2, 3); // a == 1, b == 2, c == 3; 
foo.apply(this, [1,2,3]); // a == 1, b == 2, c == 3; 

如果您想要多次調用該函數,只需將該調用放在一個循環中即可完成此操作。

3

這是預期的,您傳遞的參數將出現在您的增量函數中(如arguments請參見here for reference),但您只調用該函數一次。

2

看來你的印象是callapply方法應該爲每個參數調用functon一次。情況並非如此,它只調用一次函數。

apply方法採用參數數組:

func.apply(this, [1, 2, 3]); 

call方法需要一個參數列表:

func.call(this, 1, 2, 3);