1

В JavaScript мне нужно пройти цикл for, чтобы получить значение элемента в массиве и передать его анонимной функции. Упрощенный пример этого ниже:В JavaScript, когда цикл через цикл FOR, как передать значение элемента в массиве анонимной функции?

var aFunctions = []; 
var aStrings = ["a","b","c"]; 
for (var i = 0; i < aStrings.length - 1; i++) { 
    aFunctions[i] = function() { alert(aStrings[i]); }; 
} 
aFunctions[0](); //alerts "c" instead of "a" 

Я понимаю, почему это происходит - переменная i в настоящее время установлена ​​в 2 при выходе из цикла, а затем, когда я называю aFunctions[0](), функция выстреливает и оценивает aStrings[i] а не aStrings[0].

Я хочу знать, как получить значение aStrings[i], возвращенное в моем цикле for, а не когда оно выполнено.


Чтобы подробнее рассказать подробнее, я работаю на странице Карт Google, а маркеры хранятся на стороне сервера JavaScript и на стороне сервера БД. Я пишу массив при загрузке страницы, и после этого я хочу сгенерировать маркеры и дать им каждый пользовательский InfoWindow с текстом, установленным в строку HTML. Это специфический код я использую:

for (var i = 0; i < tGoogleMarker.length - 1; i++) { 
    var text = tGoogleMarker[i][4]; 
    var marker = new google.maps.Marker({ 
         position: new google.maps.LatLng(tGoogleMarker[i][0], tGoogleMarker[i][1]), 
         map: map, 
         flat: false, 
         icon: tGoogleMarker[i][2], 
         shadow: tGoogleMarker[i][3] 
         }); 
    google.maps.event.addListener(marker, 'click', function() { ShowMarkerContentPopUp(this, text); }); 
} 

Вместо того, чтобы получать HTML строки конкретных маркеров, я получаю текст последнего элемента в массиве используется для всех маркеров.

+0

это 'closures' –

ответ

0

Вы можете использовать замыкание вокруг AddListener части:

(function(text){ 
    google.maps.event.addListener(marker, 'click', function() { ShowMarkerContentPopUp(this, text); }); 
})(text); 

Это создает новые возможности и принимает переменную text в качестве аргумента. Это означает, что text внутри крышки защищен от изменения снаружи затвора.

То же самое можно сделать, чтобы решить первый пример:

for (var i = 0; i < aStrings.length - 1; i++) { 
    (function(i){ 
     aFunctions[i] = function() { alert(aStrings[i]); }; 
    })(i); 
} 

Подробнее о закрытий:

+0

Совершенных, это решение работает для моей проблемы - я ценю ответы на оба моих сниппет и ссылки на хороший' справочные страницы. – Bassmanjase

2

Вы должны использовать замыкание. Подробнее об этом здесь: How do JavaScript closures work?

var aFunctions = []; 
 
var aStrings = ["a","b","c"]; 
 
for (var i = 0; i < aStrings.length - 1; i++) { 
 
    aFunctions[i] = (function(val){ 
 
     return function() { 
 
      alert(val) 
 
     } 
 
    })(aStrings[i]); 
 
} 
 
aFunctions[0](); //alerts "c" instead of "a"

0
var aFunctions = []; 
var aStrings = ["a","b","c"]; 
for (var i = 0; i < aStrings.length; i++) { 
    aFunctions[i] = (function(arg) { return function() { alert(arg); };})(aStrings[i]) ; 
} 
aFunctions[0](); // alerts "a" 
aFunctions[2](); // alerts "c" 

http://jsfiddle.net/dbtncehf/

0

Ну, вы можете избежать необходимости беспокоиться о closures много, и достичь необходимых результатов. Это можно сделать, связав каждую переменную text с соответствующим маркером.Таким образом, ваша анонимная функция может вызвать его, используя this.text

for (var i = 0; i < tGoogleMarker.length - 1; i++) { 
var marker = new google.maps.Marker({ 
        text: tGoogleMarker[i][4], 
        position: new google.maps.LatLng(tGoogleMarker[i][0], tGoogleMarker[i][1]), 
        map: map, 
        flat: false, 
        icon: tGoogleMarker[i][2], 
        shadow: tGoogleMarker[i][3] 
        }); 
google.maps.event.addListener(marker, 'click', function() { ShowMarkerContentPopUp(this, this.text); }); 

}

 Смежные вопросы

  • Нет связанных вопросов^_^