2011-08-10 56 views
1

我試圖用「參數」變量可用以枚舉傳遞給函數,在JavaScript中參數的函數,使用:犀牛不枚舉「參數」的功能

for (var i in arguments){ 
    ... 
} 

這似乎是在鉻和螢火蟲控制檯爲我工作,而不適用於犀牛。在前兩種情況下,我可以成功地進入for循環並查看參數,而對於後者,似乎甚至沒有輸入for循環。

爲什麼會發生這種情況,我該如何防止這種情況發生?

+0

您可以確認參數包含你認爲它的價值? – Thilo

+2

我希望*從'arguments'評估的對象至少具有'length'和'caller'和'callee'屬性......因爲這些是每個規範需要的*。請注意,'for(var x in arrLikeThing)'形式通常是*不正確的代碼*。比較'for(var i = 0; i 2011-08-10 05:31:53

+0

嗨蒂洛,是 - 這裏是從我的終端片段: '阿比納夫@阿比納夫:〜/ js_codes $貓testfunc.js 函數main(){ 爲(VAR我在參數) 打印(我); } a = main(「javascript」,「rocks」); abhinav @ abhinav:〜/ js_codes $ rhino testfunc.js abhinav @ abhinav:〜/ js_codes $' – Anonymous

回答

1

Javascript for..in looping over arguments ie.for(arg in arguments) does not work in IE8 but it works in Chrome 8

首先,而參數對象的功能中可用的是不是一個數組,它是「陣列狀」足夠使得增量for循環(對於(VAR I = 0,len = arguments.length; i < len; i ++){...})更好 - 不僅因爲它運行得更快,而且還因爲它避免了其他缺陷 - 其中一個就是你正在陷入的問題。

要真正回答,爲什麼第二循環不工作的問題,它實現for ... in循環不只是什麼是最重要的:它通過對象中發現的所有枚舉的屬性進行迭代。現在,我在該陳述中加了兩個單詞,因爲我有意使用這兩個單詞來表示一些細微差別,雖然它們看起來很微妙,但如果您不知道發生了什麼,它可能會嚴重影響代碼的行爲。我們首先讓我們專注於所有 - 我的意思是說,不僅僅是對象本身的屬性,還包括對象從它的原型,或者原型的原型繼承的潛在屬性,等等。由於這個原因,經常建議你通過立即另外限定條件if(obj.hasOwnProperty(p))來「保護」任何for ... in循環(假設你的循環被寫爲(var p in obj ))。

但這不是你在這裏遇到的。爲此,讓我們專注於第二個詞,enumerable。對象在JavaScript中的所有屬性都是可枚舉或不可枚舉的,這幾乎直接關係到屬性是否顯示在for ... in循環中。在Firefox和IE等瀏覽器中,事實證明,arguments對象的數字屬性不是可枚舉的(它的長度也不是這樣),這正是爲什麼你沒有遍歷任何東西!

+0

不要忘記_accept_ –