Рассмотрим этот небольшой фрагмент 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
, но я предпочитаю первый метод.
] В ответах я ищу подтверждение того, что я делаю это правильно, или предложение, как мне следует это делать.