EventListener和for3中的循环

时间:2014-01-08 11:55:03

标签: actionscript-3 flash events for-loop

请使用以下代码:

   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

所以结论是事件被正确注册,但是以奇怪的方式,匿名函数只从i中获取最后一个值。

有谁知道为什么会这样?
如果这样做,请分享,但不要像以下那样回答:'我首先计算,并且显然事件是在'之后注册的。我想知道是否有人对原因和影响有更深入的了解


编辑: 根据新的答案,我已经编辑了这个问题,因为我意识到它并没有“到达现场” 好的,请提供以下代码:

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);

    }

dummy被创建为新的var,因此在每次迭代时循环内部都有一个新指针。所以通常函数内部的虚拟元素应该是不同的。仍然是同一个假人。

现在经过更多测试后,我意识到在'for {var x}'的情况下,编译器只使用var关键字一次,所以基本上它会改变像'var x; for {}'< /强>


2 个答案:

答案 0 :(得分: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

在你的第二个例子中,名字是在循环中创建的,所以我在循环中被评估,你得到了预期的输出。

答案 1 :(得分:2)

我花了一段时间才发现它。

事件发生时会调用该函数。因为函数在你的循环中,所以在那里调用它。

在添加到舞台事件时,正在添加动画片段时调用它。由于这种情况发生在同一次迭代中,因此i的值是正确的。

在循环完成后,enterframe开始发生。当函数被调用时,i的值为10.因此,你总是得到10。

在第二个示例中,您不在函数中使用i的值。 i的值在每次迭代时都在名称中解析,因此在名称中,当循环中解析时,您将获得i的值。