2014-01-08 2 views
2

Возьмем следующий код:EventListener и петли в as3

import flash.display.MovieClip; 

    var q:MovieClip; 

    for(var i=0;i<10;i++) 
    { 
     q=new MovieClip(); 
     q.addEventListener(Event.ADDED_TO_STAGE,function(e){trace("<<<<>"+i)}); 
     q.addEventListener(Event.ENTER_FRAME,function(e){trace(">"+i)}); 
    addChild(q); 

     } 

Выход будет:

<<<<>0 
<<<<>1 
<<<<>2 
<<<<>3 
<<<<>4 
<<<<>5 
<<<<>6 
<<<<>7 
<<<<>8 
<<<<>9 
>10 
>10 
>10 
>10 
>10 
>10 
>10 
>10 
>10 

Теперь, что хорошо видно в том, что в то время как Event.ADDED_TO_STAGE правильно зарегистрирован, Event.ENTER_FRAME нет, он зарегистрирован только для последнего значения.

Теперь здесь становится сложнее, возьмите следующий код:

import flash.display.MovieClip; 

var q:MovieClip; 

for(var i=0;i<10;i++) 
{ 
    q=new MovieClip(); 
    q.name="q_"+i; 
    q.addEventListener(Event.ADDED_TO_STAGE,function(e){trace("<<<<>"+i)}); 
    q.addEventListener(Event.ENTER_FRAME,function(e){trace(">"+e.target.name)}); 
addChild(q); 

    } 

Выход будет:

<<<<>0 
<<<<>1 
<<<<>2 
<<<<>3 
<<<<>4 
<<<<>5 
<<<<>6 
<<<<>7 
<<<<>8 
<<<<>9 
>q_0 
>q_1 
>q_2 
>q_3 
>q_4 
>q_5 
>q_6 
>q_7 
>q_8 
>q_9 

Поэтому вывод о том, что события правильно зарегистрированы, но странным образом Функция annonymous принимает только последнее значение из i.

Кто-нибудь знает, почему это происходит?
И если да, пожалуйста, поделитесь, но не ответьте в ближайшее время: «Ну, я вычисляется первым, и ясно, что события регистрируются после«. Я хотел бы знать, если кто-то имеет более глубокое представление о причинах и последствие


Edited: В свете новых ответов я отредактировал вопрос, так как я уже понял, что это не «хита пятно» Хорошо дать этот код:

for(var i=0;i<10;i++) 
{ 
    var q:MovieClip; 
    q=new MovieClip(); 
    var dummy:int; 
    dummy = 6+i; 
    q.addEventListener(Event.ENTER_FRAME,function(e){trace(dummy);}); 
    addChild(q); 

    } 

манекен создается как новый вар, таким образом, новый указатель внутри цикла на каждой итерации. Таким образом, обычно манекен внутри функции должен быть другим. Все-таки такой же манекен.

Теперь после нескольких тестов я понял, что в случае «для {вар х}» компилятор использует УАК ключевое слово только один раз, так что в основном она изменяется во что-то вроде «вар х, для {}»


ответ

3

i оценивается при вызове функции, а не при ее объявлении. Слушатель ADDED_TO_STAGE вызывается внутри цикла, потому что объект добавляется на сцену внутри цикла. Вызов ENTER_FRAME вызывается при следующем вводе кадра, который будет после завершения всего кода в текущем кадре. На данный момент i будет 10, потому что цикл закончен.

Вот упрощенный пример:

var i:int = 0; 

function f() { 
    trace(i); 
} 

f(); // output: 0 
i = 2; 
f(); // output: 2 

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

+0

Я отредактировал свой ответ. – bwroga

+0

Спасибо за ответ :) –

2

Понадобилось время, чтобы это выяснить.

Функция вызывается, когда происходит событие. Поскольку функция находится внутри вашей петли, она называется там.

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

Вводная диаграмма начинается после завершения цикла. При вызове функции значение i равно 10. Следовательно, вы всегда получаете 10.

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

+0

Спасибо за ответ :). Оба ответа действительно верны, трудно выбрать лучший из них: P –

+0

, так как bwroga был раньше, вы можете выбрать его :) –

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