AS3 передать параметр по значению - PullRequest
0 голосов
/ 07 мая 2010

У меня проблемы со следующим кодом:

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. Я бы хотел, чтобы эта функция вызывалась с соответствующим индексом.

Надеюсь, я объясню, заранее спасибо.

Ответы [ 3 ]

1 голос
/ 24 ноября 2012

Содержимое функции принадлежит функции, не используйте переменные извне.Как и 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]);
}

Этот способ передачи ваших параметров безопаснее.Это лучше проиллюстрировано в этом ответе .

0 голосов
/ 07 мая 2010

Есть еще один способ добиться того, что вы хотите это не всегда желательно, но иногда удобно ...

0 голосов
/ 07 мая 2010

Это не про "передачу параметров по значению" или нет. Объявленная вами функция обработчика событий вообще не обращается к переменной i в качестве параметра. Вот почему значение i не определяется циклом for.

Есть несколько способов справиться с этой ситуацией. Вы можете создать новый класс, который расширяет Event, и добавить туда значение индекса.

ИЛИ вы можете создать массив и хранить faceLoaders с нужным вам индексом. А затем вызовите LoadCara () с правильным индексом, ища соответствующий индекс в массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...