0

単純化したい次のコード:

    _root.botao1.onRelease = function(){
        follow=1;
    }
    _root.botao2.onRelease = function(){
        follow=2;
    }
    _root.botao3.onRelease = function(){
        follow=3;
    }

次のコードで実装しようとしました。

for(i=0;i<3;i++){
    _root['botao'+i].onRelease = function(){
        follow=i;
        trace(follow);
    }
}

動作するはずですが、現在のフォロー値をトレースバックすると、常に「3」が返され、実際に 1 または 2 をクリックしてもメーターは表示されません。

どうすれば修正できますか?

4

1 に答える 1

0

すべてのボタンが同じ値を出力する理由は、すべての onRelease 関数が同じ変数 i を参照し、ループの実行が終了したときに値 3 が含まれているためです。

簡単な解決策は、ループの反復ごとに i の値を単純にクリック可能なオブジェクトの変数に格納することです。

for(i = 0; i < 3; i++) {
   var mc : MovieClip = _root['botao' + i];
   mc.follow = i + 1;
   mc.onRelease = function(){
      trace(this.follow);
   }
}

把握するのが少し難しいかもしれない別の解決策は、無名関数を定義してすぐに呼び出すことです (最後の () に注意してください)。この匿名関数は、独自のスコープ内の i の現在の値を follow という変数に格納し、別の匿名関数 (onRelease がトリガーされたときに実行するロジックを含む) を返します。返される関数は、次の変数にアクセスできます。

for(i = 0; i < 3; i++) {
    _root['botao' + i].onRelease = (function() {
        var follow = i + 1;
        return function(){
            trace(follow);
        }
    })();
} 
于 2013-05-09T21:35:57.130 に答える