请使用以下代码:
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 {}'< /强>
答案 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的值。