2

私は何年も Actionscript に触れていませんでしたが、これは私の心を吹き飛ばします...しかし、それはかなり簡単なはずです。

わかりました、簡単なテスト シナリオを作成しました。ライブラリに「mcTest」という名前のムービークリップがあります。これは、フレーム 1 (唯一のフレーム) に次のアクション スクリプトを含む単純な正方形です。

var test = false;

function setTest() {
  test = true;
  trace(test);
}

this.addEventListener(MouseEvent.CLICK, click_handler);

function click_handler(e:MouseEvent) {
  trace(test);
}

ステージ (フレーム 1、これも唯一のフレーム) には、次のコードがあります。

var objTest:MovieClip = new mcTest();
objTest.setTest();
addChild(objTest);

プロジェクトが実行されると、コンソールに予想される「True」が表示されます。MovieClip をクリックすると、予期しない "False" が表示されます。あたかも変数がリセットされたかのように。どうしたの?「objTest.setTest();」を削除すると メインステージから「setTest();」という行を追加するだけです MovieClip 自体の内部では、MovieClip をクリックすると、期待される "True" が返されます。

ところで、すぐに適切に型付けされた変数と関数を使用したクラスベースのアプローチに移りますが、今のところ、私が知っていることに固執します;)

更新

奇妙なことに、mcTest 内の最初の行を次のように変更すると、次のようになります。

var test;

またはこのように:

var test:Boolean;

コードは期待どおりに機能します。変数を初期化するべきではないようです(そして、よく書かれたコードでは、もちろんその目的のためにコンストラクターを使用します)

それでも、理由はわかりません。私の記憶が正しければ、初期設定は古いバージョンの Flash/Actionscript で動作するはずです。

私の理解のために。誰かが何が起こっているのか知っているなら、私を更新してください。

4

1 に答える 1

1

setTest では、という名前の新しいローカル変数を宣言しているtestため、保存されません。

var test = false;

function setTest(){
    trace(test); //will return undefined

}

なんで?コードがムービークリップに含まれているためです。ステージに追加されていないときは、コードは実際には実行されていません(var test = falseコードが実行されるのは、フレームが実行されたときのみです。これは、コードがステージに追加された後である必要があり、フレームが通過する必要があります。

テストするには、これをフレーム 1 に配置します。

var objTest:MovieClip = new mcTest();
addChild(objTest);
trace(objTest.test); //undefined

これをフレーム 2 に入れます。

trace(objTest.test);

結果は、undefinedそして になりfalseます。

于 2013-08-11T09:02:05.247 に答える