2011-04-01 42 views
9

這樣就不會有誤解,這個問題不是關於在JS函數中允許可選參數的問題。在JavaScript函數中使用忽略參數的目的/好處是什麼?

我的問題是由jQuery的parseXML功能,這是在jQuery.js定義如下motiviated:

// Cross-browser xml parsing 
// (xml & tmp used internally) 
parseXML: function(data, xml, tmp) { 
    ... 
} 

在函數的主體中,所述參數xml和和tmp是在使用之前均轉讓。這意味着它們被用作局部變量,因此函數可以被這樣定義:

parseXML: function(data) { 
    var xml, tmp; 
    ... 
} 

是什麼做的第一種方式的好處,比在jQuery.js縮小的版本節省幾個大字其他?

+2

可能是遞歸嗎? – 2011-04-01 22:56:52

+4

@fireeyedboy - 由於它們是在被訪問之前設置的,我不確定它們如何用於遞歸。我認爲喬爾已經正確地確定了他自己問題的答案 - 以節省幾個字符。 – Ender 2011-04-01 22:59:08

+0

@fireeyedboy - parseXML不是遞歸的 – 2011-04-01 23:00:56

回答

3

如果我們定義兩個函數...

function a (foo) { } 
function b (foo, bar, baz) {} 

...他們會報告不同lengths ...

console.log([a.length, b.length]); // logs [1, 3] 

這是非常罕見的,看慣的JavaScript this little known feature

但除了縮小文件大小的幾個字節,這是我能想到的唯一的其他原因。

+0

+1我當然不知道它。 – 2011-04-08 00:26:01

1

一般來說,如果要將此函數作爲回調函數或延續函數傳遞給另一個函數,並且API合約指出「我可以將未使用的參數添加到函數以符合某些預先約定的函數簽名用這些參數調用你的回調函數「,並且你不需要所有的參數來完成你想要在回調中做的事情。 (這適用於任何語言,而不僅僅是JavaScript。)

在這個特定情況下,我不知道。 parseXML如何使用;是直接調用的,還是用作其他可能需要3個參數函數的函數的參數?

+3

那也不是。如果你沒有通過它所期望的所有參數,或者如果你傳遞的比預期更多的話,JavaScript不關心。看看這個演示證明:http://jsfiddle.net/Ender/aEgyF/ – Ender 2011-04-01 23:04:39

+0

是的,我相信你沒有尋找證據。我只是在描述你可能會這麼做的原因,儘管我猜在JS中這不是一個有效的原因。 (另外,我查看了jQuery.js源代碼,並回答了我自己關於如何使用parseXML的問題:它可以用作其他函數的參數,但AFAICT只會傳遞第一個參數。) – metamatt 2011-04-02 02:16:34

1

(xml & tmp used internally)

你誤解了意思。它們在功能中並不意味着「內部」。它們意味着在圖書館內部。這個函數的公共API有一個參數(數據)。這個函數的私有API有3個參數。

這在jQuery中很常見。一般而言,這些功能可以在沒有副作用的情況下工作。沒有副作用的API是public的,jQuery本身會傳入更多的參數來引起你作爲用戶不應該做的副作用。

+1

+1澄清「內部使用」的意圖。基本上,然後,一些函數具有不屬於公共API的可選參數。然而,在'parseXML'的情況下,「額外」參數不會導致副作用,因爲它們在被使用之前被覆蓋。也許他們習慣於在早期版本中引起副作用。 – 2011-04-08 00:24:45

相關問題