[英]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.