2012-06-04 106 views
4

我最近遇到了一些JavaScript問題,它違背了我的編程背景的每個骨骼。 Javascript經常對我這樣做,所以我沒有那麼驚訝。Javascript如何處理函數參數

我有一個功能,因爲這樣...

function x(param1, booleanParam, arrayParam){ 
    .... 
} 

我得到一個運行時錯誤說arrayParam.length沒有定義。在調試時,我看到這是真的,並去找出原因。原來我曾在我的函數調用這樣被遺忘的一個逗號......

x(param1, true [arrayJunk]); 

我有是找出爲什麼這個電話是在所有提出的問題?爲什麼這不是一個編譯錯誤,Javascript如何看待這個問題並思考:「是的,這看起來可能有用!」

在此先感謝您分享的任何啓示!

+0

這種情況下,使用「Array」構造函數而不是文字語法會提供一個有用的SyntaxError,但是您可能會遇到傳遞單個數字參數導致不同靜默錯誤的潛在問題。 – 2012-06-04 16:55:48

回答

3

這是一個索引表達式。
someArray[someIndex]的語法相同。

它也將最終傳遞undefined作爲第二個參數,除非arrayJunk碰巧是布爾基元屬性的名稱。

+0

在JavaScript中,「true」不是保留字嗎?它如何嘗試做一個基礎性的索引? – Shaded

+0

@Shaded:在Javascript中,一切都是一個對象。例如,'true [「toString」]()'將返回'「true」'。 – SLaks

+2

並非一切都是一個對象; '1,true和「23443」'是原語。只有'typeof'返回「對象」的東西纔是真實的對象。但是一切都可以轉換成一個對象,這就是JS引擎的功能 –

0

在這種情況下,表達式被解釋爲索引。基本上是一樣的

someArray[42] 

所以,它被看作是有兩個參數,而不是3

2

函數調用什麼情況如下:

  • JavaScript引擎轉換trueBoolean對象(不是原語)
  • 然後它嘗試訪問存儲在arrayParam中的屬性名稱
  • 屬性不存在,所以它返回undefined

如果arrayParam是字符串"toString",它會返回一個函數對象,如果你通過

0

許多動態語言不檢查過多或過少一個函數的參數。

雖然這有時會掩蓋錯誤,但它也允許您推出自己的defalut參數方案。