代码之家  ›  专栏  ›  技术社区  ›  alejandrobog

AS3按值传递参数

  •  0
  • alejandrobog  · 技术社区  · 15 年前

    我对以下代码有问题:

    for (var i:Number=0; i<numFaces;i++){
        var faceLoader:Loader = new Loader();
        faceLoader.contentLoaderInfo.addEventListener( Event.INIT, 
        function(fle:Event){
            LoadCara(i,faceLoader);
            trace("LoadCara:" + i.toString());
        } );
    }
    
    function LoadCara(index:int,loader:Loader){
      if(index == 0)
      {
        trace("cara1:" + index.toString());
        cara1.removeChildAt(0);
        cara1.addChild(loader);
      }
      else if(index == 1)
      {
        cara2.removeChildAt(0);
        cara2.addChild(loader);
      }}
    

    问题是每次迭代时,我都会将变量i发送到函数loadcara,它总是用i的最后一个值来调用。我希望用appropiate索引来调用这个函数。

    希望我能解释一下,提前谢谢。

    3 回复  |  直到 12 年前
        1
  •  0
  •   bitc    15 年前

    这与“按值传递参数”无关。您声明的事件处理程序函数不访问 i 变量作为参数。这就是为什么 不是由for循环确定的。

    有几种方法可以处理这种情况。您可以创建一个扩展事件的新类,并在其中添加索引值。

    或者,您可以创建一个数组,并使用所需的索引存储faceloader。然后通过在数组中查找匹配的索引,使用正确的索引调用loadcara()。

        2
  •  1
  •   Community CDub    8 年前

    函数的内容属于函数,不要使用来自函数外部的变量。喜欢 cara1 cara2 ,那 i 不属于正在使用它的函数。

    但是修复代码很简单:

    for (var i:Number = 0; i < numFaces; i++) {
      var fLoader:Loader = new Loader();
      fLoader.contentLoaderInfo.addEventListener(Event.INIT, LoadCara(i, fLoader));
      trace("LoadCara:" + i.toString());
    }
    
    function LoadCara(index:int, loader:Loader):Function {
      return function(fle:Event):void {
        if (index == 0) {
          trace("cara1:" + index.toString());
          cara1.removeChildAt(0);
          cara1.addChild(loader);
        } else if (index == 1) {
          cara2.removeChildAt(0);
          cara2.addChild(loader);
        }
      }
    }
    

    如果你想使用 removeEventListener() 稍后,将循环调整为:

    var functionsLoadCara:Object = new Object();
    for (var i:Number = 0; i < numFaces; i++) {
      var fLoader:Loader = new Loader();
      functionsLoadCara[i] = LoadCara(i, fLoader);
      fLoader.contentLoaderInfo.addEventListener(Event.INIT, functionsLoadCara[i]);
      trace("LoadCara:" + i.toString());
    }
    

    然后,当您不再需要事件侦听器时,请执行以下操作:

    for (var i:Number = 0; i < numFaces; i++) {
     fLoader.contentLoaderInfo.removeEventListener(Event.INIT, functionsLoadCara[i]);
    }
    

    这样传递参数更安全。它在 this answer .

        3
  •  0
  •   Community CDub    8 年前

    还有另一种方法可以实现 what you want 这并不总是明智的,但有时很方便…