Изменить переменную на литерал во время выполнения? - PullRequest
0 голосов
/ 16 февраля 2009

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

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

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

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

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

ОБНОВЛЕНИЕ: добавлен индекс [i] в ​​myElement (упс)

Спасибо, Cameron

Ответы [ 2 ]

2 голосов
/ 16 февраля 2009

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

Вот один из способов исправить это:

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

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

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

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

1 голос
/ 16 февраля 2009

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

Посмотрите этот урок на Уроках JavaScript .

Обновление: для некоторых примеров кода / синтаксиса взгляните на этот вопрос, который я задал здесь по той же теме - использование замыканий для обработчиков событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...