Рассмотрим этот небольшой фрагмент JavaScript:
for(var i in map.maps)
{
buttons.push($("<button>").html(i).click(function() { alert(i); }));
}
Создает одну кнопку для каждого из полей в объекте map.maps
(это массив ассоциаций). Я установил указатель в качестве текста кнопки и настроил его также на оповещение. Очевидно, можно ожидать, что все кнопки будут предупреждать свой собственный текст при нажатии, но вместо этого все кнопки будут предупреждать текст окончательного индекса в объекте map.maps
при нажатии.
Полагаю, такое поведение вызвано изящным образом JavaScript обрабатывает замыкания, возвращаясь и выполняя функции из замыканий, в которых они были созданы.
Единственный способ обойти это - установить индекс в качестве данных для объекта кнопки и использовать его из обратного вызова click. Я также мог бы имитировать индексы map.maps
в моем объекте buttons
и находить правильный индекс при нажатии, используя indexOf
, но я предпочитаю первый метод.
То, что я ищу в ответах, это подтверждение того, что я делаю это правильно, или предложение о том, как я должен сделать это.