actionscript-3 - as3中的EventListener和for循环

标签 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 中的最后一个值。

有人知道为什么会发生这种情况吗?
如果是,请分享,但不要简短地回答:“首先计算 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{}'


最佳答案

i 在调用函数时计算,而不是在声明函数时计算。 ADDED_TO_STAGE 监听器在循环内部调用,因为对象是在循环内部添加到舞台的。 ENTER_FRAME 监听器在下一次进入帧时调用,这将在当前帧中的所有代码执行完毕之后进行。此时,i 将为 10,因为循环已完成。

这是一个简化的示例:

var i:int = 0;

function f() {
    trace(i);
}

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

在第二个示例中,名称是在循环内创建的,因此 i 在循环内进行评估,并且您会得到预期的输出。

关于actionscript-3 - as3中的EventListener和for循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20994925/

相关文章:

javascript - onscroll 不适用于 IE

javascript - jQuery 是否清空通过 addEventListener 附加的分离监听器?

flash - 使用 event.target 信息创建 Movieclip 实例

javascript - 如何从客户端应用程序加载 Fusion Tables csv?

flash - 有没有办法让Flash强制静态类型?

javascript - Rails AJAX 反馈,尤其是错误反馈

actionscript-3 - 弹性 : Determine if Space key is held down during MouseEvent

actionscript-3 - 如何在没有舞台引用的情况下设置输入文本字段的焦点?

c# - 调试 AxShockwaveFlash

javascript - 使用文本输入值动态更改链接 href 属性