2009-02-16 3 views
0

Я немного начинаю с javascript, и я не могу придумать пути вокруг следующей проблемы. Я использую Mootools в этом примере, хотя это не Mootools вопрос:Изменить переменную на литерал во время выполнения?

for (var i = 0; i < 5; i++) { 
    myElement[i].addEvent('click', function() { otherFunction(i); }); 
} 

Всякий раз, когда кто-то нажимает на MyElement, otherFunction называется (хорошо), но прошло 5 (плохо). Я знаю, что это потому, что acesses I после завершения цикла (при нажатии на элемент), но я не могу за жизнь думать о какой-либо альтернативы для монотонной

switch(i) { 
    case 1: myElement[i].addEvent('click', function() { otherFunction(1); }); break; 
    case 2: myElement[i].addEvent('click', function() { otherFunction(2); }); break; 
    // ... 
} 

кроме Там должен быть лучший путь ... Я чувствую, что я пропускаю что-то очевидное

UPDATE: Добавлено [я] индекс к MyElement (ой)

Спасибо, Кэмерон

+0

Зачем вам нужно пять обработчиков щелчков на одном элементе? Насколько я вижу, два блока кода достигают разных целей, которые на самом деле не ясны. – montrealist

ответ

2

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

Вот один способ, которым Вы могли бы это исправить:

function getClickHandler(i) 
{ 
    return function() { otherFunction(i); } 
} 

for (var i = 0; i < 5; i++) { 
    myElement.addEvent('click', getClickHandler(i)); 
} 

Это перемещает создание закрытия в другую область, которая будет «сохранить» каждое значение я

Другим способом было бы просто иметь обработчик с одним кликом, который может быть назначен каждому элементу, и вычисляет, который был нажат на объект события (при условии, что вы хотите прикрепить эти обработчики к различным элементам, хотя код указывает, что вы хотите, чтобы несколько обработчиков на были такими же eleme nt, что немного нечетно :)

1

Я согласен с комментарием сомнению, почему вам нужно пять обработчиков щелчков для сингла e, но для достижения желаемого вам нужно использовать закрытие.

Взгляните на этот учебник на JavaScript tutorials.

Обновление: Для некоторых примеров кода/синтаксиса взгляните на this question I asked here по тому же вопросу - с помощью закрытий для обработчиков событий.

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