gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:37:50 25 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 中的最后一个值。

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

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