AS3 - вопрос о привязке символов

Я новичок в AS3 и не могу понять, почему этот цикл ведет себя не так, как «должен».

for each (var s in [_set, _set.otherSet]) {
  for each (var f in [s.frame_top_mc, s.frame_bottom_mc]) {
    f.addEventListener(MouseEvent.CLICK, function( ):void {
      _score[f.category] += 1;
      madeSelection(f);
    });
  }
}

Как я могу дать каждой анонимной функции ссылку на каждый объект, представленный f, а не просто ссылку на f каждый раз?

В частности, почему каждая копия анонимной функции привязывается к одной ссылке на f? Чем (я должен сказать, почему) именно AS3 отличается от JavaScript в этом отношении?


person Chris Tonkinson    schedule 20.04.2011    source источник


Ответы (1)


Это должно быть так:

for each (var s in [_set, _set.otherSet]) {
  for each (var f in [s.frame_top_mc, s.frame_bottom_mc]) {
    f.addEventListener(MouseEvent.CLICK, function( e:MouseEvent ):void {
      _score[e.currentTarget.category] += 1;
      madeSelection(e.currentTarget);
    });
  }
}

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

person Adam Smith    schedule 20.04.2011
comment
Я знал, что это, вероятно, так, но не знал, как это обойти. Спасибо! - person Chris Tonkinson; 20.04.2011