簡體   English   中英

for循環中的JavaScript閉包

[英]JavaScript closures in for-loop

正如這里所解釋的http://www.mennovanslooten.nl/blog/post/62/以下代碼輸出的結果僅為“5x5”之前忘記了任何事情。

for (x = 1; x <= 5; x++) {
for (y = 1; y <= 5; y++) {

    var cords = x+"x"+y;
    var el = document.getElementById(cords);
    el.addEventListener("click", function (e) { B_modeWindow('1', cords); });

}
}

到目前為止,我有信息(上面提供的博客鏈接)無法弄清楚如何更改顯示代碼來修復它。

如何在我的for循環中使用JavaScript閉包來遍歷此代碼?

編輯:我不明白。 varibles以良好的方式定義。 測試:

for (x = 1; x <= 5; x++) {
for (y = 1; y <= 5; y++) {

    var cords = x+"x"+y;
    alert(cords);

}
}

使用您需要作為參數關閉的任何內容調用該函數。 在這種情況下,那是cords

for (x = 1; x <= 5; x++) {
    for (y = 1; y <= 5; y++) {
        var cords = x + "x" + y;
        var el = document.getElementById(cords);

        (function(cords) {
            el.addEventListener("click", function (e) { B_modeWindow('1', cords); });
        })(cords);
    }
}

Minitech很接近,但你必須在函數內移動閉合變量:

for (x = 1; x <= 5; x++) {
    for (y = 1; y <= 5; y++) {
        (function() {
            var cords = x + "x" + y;
            var el = document.getElementById(cords);
            el.addEventListener("click", function (e) { B_modeWindow('1', cords); });
        })();
    }
}

問題是js變量有函數作用域,因此當你通過循環時,cords變量會被重寫。 因此,所有偵聽器函數都指向同一個變量,該變量以最終值結束。 對此的一個解決方案是創建另一個將el和cords作為參數的函數,並向el添加基於cords的偵聽器。 然后從內循環調用此函數,而不是直接在其中添加偵聽器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM