2011-10-22 61 views
1

为什么不是这个工作,因为我认为这多少:传递局部变量装载机匿名处理函数

var i:int=-1; 
for each(obj in myData) 
{ 
    i++; 
    var loader:Loader=new Loader(); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE,function(event:Event) 
    { 
     trace(i); 
    }); 
} 

有在myData的3个对象,并跟踪声明的样子:

2 
2 
2 

代替:

0 
1 
2 

如果我添加i到阵列(像myArr.push(i))它将有3种元素,0,1和2

任何想法? 谢谢。

回答

1

首先让我告诉你为什么它不能像你期望的那样工作。 发生的事情是,for循环遍历元素,并创建所有加载器,递增i,但Event.COMPLETE稍后会发生,其中i已经在值2,所以这就是为什么您会得到该输出。

由于wvxvw建议,你需要更多的数据结构是这样的:

class MyLoader { 

    private var i: int; 
    private var loader: Loader; 

    function MyLoader(i:int) { 
     this.i = i; 

     loader = new Loader(); 
     loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded); 
    } 

    function onLoaded(event:Event) 
    { 
     trace(i); 
    } 
} 

而且你会在你的循环使用它:

var i:int = 0; 
for each(obj in myData) { 
    var loader:MyLoader=new MyLoader(i++);  
} 

当然,你需要向MyLoader添加更多内容,比如处理错误,并传递更有意义的东西以使所有内容都能正常工作。

+0

啊,我现在明白了。当所有字节被加载时,匿名函数会触发。我认为它一直是像JS那样的一个“变量”,并且像声明时那样持有它。谢谢。 – Francisc

+1

您正在考虑JavaScript中的闭包.. ActionScript(即ECMAScript变体)也会这样做,但是您必须将所有内容包装到另一个函数中,并将'i'存储在本地变量中,如下所示:http:// pastebin.com/iRdMZ0uc。 –

3

这就是你已经采取了...只是没有做任何的那些你正在尝试做的事情,它会没事的一个非常不好的做法......在这里使用匿名函数没有点(这是从来没有实际上在AS3中),没有意义使用for-each,因为你需要的是for(;;)。你使用动态类型没有什么好处(在AS3中动态类型没有任何好处,反正也没有好处)。而且,是的,关闭会捕捉上下文,上下文只有一个i,它的值是2,所以第一个跟踪是你应该期望的。

,你应该做的事情 - 装载机存储一些数据结构和数据结构后接他们(当你需要的标识符)。并请,为我们的用户着想,负载无论你要加载顺序 - 因为如果你不这样做,我们给你弄不处理IO错误...

+0

我认为这是一种过度概括,你永远不要需要AS3匿名函数。但是,如果您在理解函数式编程时遇到问题,您可能应该避免使用这些概念。有关如何正确进行函数式编程的更多信息,请查看http://www.developria.com/2010/12/functional-actionscript-part-1.html –

+0

谨慎使用和理解,匿名函数不会比任何其他语言功能。使用不关心和理解,他们可以像其他功能的人不普遍认识危险,如静如灾难性的(但可以在他们的方式 方式更糟) –

+0

谢谢。上面的代码是一个简化的例子来展示这个问题。这不是实际的代码。我正在监听IOErrors,我没有每次都声明var loader:Loader等等。上面的东西在JS中工作,并且很难理解为什么它不在这里工作。 – Francisc

相关问题