gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:40:15 26 4
gpt4 key购买 nike

采用以下代码:

   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{}”


最佳答案

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com