Переопределение локальной переменной в закрытии JavaScript - PullRequest
1 голос
/ 19 января 2011

У меня есть код, который выглядит следующим образом:

for( var i=0; i<10; i++ ) {
   var someClickableObject = new Object();
   someClickableObject.index = i; 

   eventListenerFunction(someClickableObject, 'click', function() {
      alert(someClickableObject.index);
   });
}

Итак, я создаю группу интерактивных объектов, присваивая каждому свойству значение, равное индексу цикла, устанавливая событие click для объекта, который оповещает егоСвойство индекса.

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

Есть идеи, как решить эту проблему?

1 Ответ

1 голос
/ 19 января 2011

Проблема на самом деле противоположна тому, что вы написали: все функции разделяют такое же замыкание.( edit - после перечитывания того, что вы написали, я не уверен, что это «что-то противоположное»; дело в том, что все эти маленькие функции, которые вы передаете «eventListenerFunction», будут совместно использовать одну и ту же переменную, "someClickableObject", так что в конце цикла все они будут ссылаться на тот, что был создан на последней итерации!)

Чтобы исправить это, вам нужно как-то ввести другую область видимости:

eventListenerFunction(someClickableObject, 'click', (function(obj) {
  return function() {
    alert(obj.index);
  };
})(someClickableObject));

Это вводит анонимную функцию.Эта маленькая функция вызывается со ссылкой на вашу локальную переменную, что приводит к созданию другой области видимости.Эта функция возвращает функцию, фактически переданную этой вещи «eventListener».Теперь у него есть собственная копия «someClickableObject».

Однако это всего лишь мелкая копия.В вашем случае это нормально, потому что вы создаете новый объект на каждой итерации.На практике мне почти никогда не приходилось беспокоиться о таком случае;обычно мелкая копия - это все, о чем мне нужно беспокоиться (потому что часто это просто счетчик, или строковый ключ, или что-то подобное).

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