Как я могу обойти закрытие Javascript?

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

] В ответах я ищу подтверждение того, что я делаю это правильно, или предложение, как мне следует это делать.

6
задан Oded 6 June 2011 в 09:02
поделиться