我目前正在使用JsHint,並且正在接收警告W083:「不要在循環中創建函數」。我從JsLint Error Explanations閱讀這篇文章,並理解你爲什麼不應該這樣做,這基本上歸結爲JavaScript的異乎尋常的本質以及變量被覆蓋的可能性。
但是,我還在這裏閱讀了其他一些帖子,雖然這是一種失禮,但它並不總是會因情況而導致錯誤。
我的情況,特別是JsHint抱怨的是一個for循環,它使用jQuery $(selector).each()
函數。該函數將一個函數作爲參數。以下是我關心的代碼片段。不要擔心,因爲我真的只是用這個作爲一個例子其實際作用+:
for (var i = 0; i < sections.length; i++) {
disableSectionState[sections[i].name] = {};
$('.' + sections[i].name).each(function (index, element) {
var id = $(element).attr('id');
disableSectionState[sections[i].name][id] = $(element).attr('disabled');
});
if (sections[i].isChecked) {
$('.' + sections[i].name).attr('disabled', 'disabled');
}
}
本質上來說,這僅僅是一個嵌套的for-each中的for循環,這樣循環我不認爲這會太危險,但我顯然不熟悉js中的所有怪癖。 截至目前,所有的東西都可以正常使用這個函數,但我想問問社區有關使用jQuery的循環中每個函數的危險。
爲了防止這被標記爲愚蠢我沒有看到this這個問題,但唯一的答案沒有涉及到任何細節或解釋任何東西,並根據評論它看起來像一個XY問題無論如何。我對更感興趣,爲什麼這是當它的核心是它本質上是一個嵌套循環。
這個函數在循環之外被提取和命名真的是更安全嗎?如果我將循環計數器複製到匿名函數範圍內的變量,是否可以消除此設計的潛在危險?該函數是否完全異步執行在主for循環之外?
+如果您確實感興趣:此代碼用於確定在啓用某些選項時是否在頁面加載時禁用某些字段。
感謝您的見解!聽起來像我應該改變它,以防止未來的問題,並有可能提高性能。由於我需要內部函數的循環計數器,聽起來像我應該滾動一個單獨的函數來處理'$ .each'循環,並單獨保存變量以防止覆蓋。 – JNYRanger
如果你使用類編寫JS,我喜歡只提供方法作爲我的事件回調。它可以讓你利用JS的靈活性,但也提供了一個很好的單元來測試。你可以使用'bind',但總是會創建一個新的函數或範圍,所以它會保證一些開銷。 – ssube