1

私は経験豊富なプログラマーですが、Flash/Actionscript を使い始めたばかりです。特定の理由により、Actionscript 3 ではなく 2 を使用する必要があるプロジェクトに取り組んでいます。

以下を実行すると (新しいフラッシュ プロジェクトのフレーム 1 に配置しただけです)、出力は 1 ではなく 3 になります。1にする必要があります。

「ii」変数のスコープがループ間で続くのはなぜですか?

var fs:Array = new Array();

for (var i = 0; i < 3; i++){

    var ii = i + 1; 
    fs[i] = function(){
        trace(ii);
    }
}

fs[0]();
4

3 に答える 3

2

残念ながら、AS2 はそのような言語ではありません。そのような閉鎖はありません。関数は AS2 では正確には第一級市民ではありません。その結果の 1 つは、関数が独自のスコープを保持しないことです。関数が呼び出されると、何らかのスコープに関連付ける必要があります (通常、関数が呼び出されるのと同じスコープ)。関数callまたはメソッドを使用しない限り、それ自体が定義されていますapply)。

次に、関数が実行されると、その内部の変数のスコープは、たまたま呼び出された場所のスコープになります。この場合、ループの外側のスコープです。これが、次のようなことができる理由でもあります。

function foo() {
    trace( this.value );
}

objA = { value:"A" };
objB = { value:"B" };

foo.apply( objA ); // A
foo.apply( objB ); // B

objA.foo = foo;
objB.foo = foo;

objA.foo(); // A
objB.foo(); // B

非常に奇妙に見える真の OO 言語に慣れている場合、その理由は、AS2 が最終的にプロトタイプ化された言語だからです。オブジェクト指向に見えるものはすべて偶然です。;D

于 2008-09-27T10:05:41.153 に答える
0

残念ながら、Actionscript 2.0 には強力なスコープがありません... 特にタイム ラインでは。

var fs:Array = new Array();

for (var i = 0; i < 3; i++){

    var ii = i + 1;     
    fs[i] = function(){
        trace(ii);
    }
}

fs[0]();
trace("out of scope: " + ii + "... but still works");
于 2008-09-26T21:54:57.790 に答える
0

私は自分の問題に対する一種の戦略的な解決策を思いつきました:

var fs:Array = new Array();

for (var i = 0; i < 3; i++){    
    var ii = i + 1;   

    f = function(j){
        return function(){
            trace(j);
        };
    };
    fs[i] = f(ii);
}

fs[0](); //1
fs[1](); //2
fs[2](); //3
于 2008-09-29T13:41:05.427 に答える