2014-12-29 70 views
2

我試圖限制暴露在一個孤立的封閉中的eval的局部變量的數量,以保持範圍儘可能沒有受到污染。但我也需要遍歷一個傳遞的數組,所以我做的非常類似於這樣:這是for-in循環標準嗎?

var oObj = [{ 
    key: "", 
    arr: { 
     "one": 1, 
     "two": 2, 
     "three": 3 
    } 
}]; 

for (oObj[0].key in oObj[0].arr) { 
    console.log(oObj[0].arr[oObj[0].key]); 
} 

在我實際的代碼,oObj傳遞到closure'd函數作爲第一個參數(如arguments[0])等等唯一暴露給該函數的局部變量是arguments(無論如何都是暴露的)。

此代碼按預期工作,但jshint.com列出了不少於12個警告代碼塊。

所以......我在這裏推動信封太遠還是我符合標準?對於keyfor-in迴路可以使用object.property嗎? JSHint似乎並不這麼認爲,而我嘗試過的所有內容似乎都很滿意。

+1

注意,有什麼之間的規範允許(任何事情),什麼被認爲是「最佳實踐」的差異(什麼棉短絨如JSLint的和JSHint檢查)。僅僅因爲它沒有通過JSHint並不意味着它不是有效的JavaScript代碼。 –

回答

4

According to the ECMAScript standards,語法用於for-in循環是

IterationStatement:對於(LeftHandSideExpression表達聲明

而且a LeftHandSideExpression can be a CallExpression,其還可以是

CallExpressionIdentifierName

所以,是的,根據標準,這是一個有效的for-in循環。

但它是否令人困惑?是。爲什麼不只是做這樣的事情:

for (key in oObj[0].arr) { 
    oObj[0].key = key; 
    console.log(oObj[0].arr[key]); 
} 
+0

由於'key'污染了本地範圍,並且可能在'eval'中被錯誤地改變。現在......「參數」(只要它在函數之外)也是如此,但這種可能性較小。這絕對是令人困惑的!我簡化了上面例子的代碼!我也使用'while'和'shift'來通過JS來旋轉'eval';)哦,謝謝!我符合標準! – Campbeln

+1

還有'oObj [0] .arr.forEach(...)'這可能有助於確定範圍問題。 –

+0

Ohh ...'.forEach' ...我必須爲舊版瀏覽器(內存中的IE8)填充它,但這可能是一種偷偷摸摸的方式來實現這一點,而不會嚇到JSHint!? – Campbeln