1

私はActionscript2.0で初めていくつかの作業を行っていますが(本当に単純なもので、テキストファイルからコンテンツをプルするだけです)、なぜここでそのような予測できない出力が得られるのか、私は一生理解できません。

このような単純なスクリプトをテストビルドすると、変数が未定義としてリストされる場合と、そうでない場合があります。

これは、cookware.txtからロードされたデータがまだメモリにロードされていないことが原因である可能性がありますが、そうではないようです-ここのActionscript辞書によると、onLoad関数は次の場合にのみ起動しますプログラムの残りの部分にアクセスできるように、データがロードされました。

誰かが光を当てることができますか?または、なぜこれが発生する可能性があるのか​​わかりますか?

cockware.txtの内容:

pots=44&kettles=43

コード

_global.pots;
_global.kettles;

trace('variables not assigned')
trace('before: kettles (global) = ' + _global.kettles);

trace('before: pots (global) = ' + _global.pots);

var my_lv:LoadVars = new LoadVars();

my_lv.onLoad = function(success:Boolean):Void {
    if (success) {

        trace('variables clearly loaded: kettles = ' + kettles); 

        _global.kettles = this.kettles;

        trace('assigned during loop: kettles in = ' + _global.kettles); 


        trace('pots = ' + kettles);

        _global.pots = this.pots;

        trace('during: pots = ' + _global.pots);

     } else {
        trace("Error");
    }
}


my_lv.load("cookware.txt");

trace('after: kettles (global) = ' + _global.kettles);

trace('after: pots (global) = ' + _global.pots);

出力::

時々それはこれです:

variables not assigned
before: kettles (global) = undefined
before: pots (global) = undefined
after: kettles (global) = undefined
after: pots (global) = undefined
variables clearly loaded: kettles = undefined
assigned during loop: kettles in = 43
pots = 43
during: pots = 43

そして時々それはこれです:

variables not assigned
before: kettles (global) = 43
before: pots (global) = 44
after: kettles (global) = 43
after: pots (global) = 44
variables clearly loaded: kettles = 43
assigned during loop: kettles in = 43
pots = 43
during: pots = 43

繰り返しますが、変数が未定義であるかどうかは完全にランダムに見えます。ここで何が起こっているのですか?

4

4 に答える 4

1

スコープ チェーンの問題が発生している可能性があります。Flash での動作は非常にわかりにくいものです。簡単な答えは、_global.pots と _global.kettles に、外部ファイルで使用されている名前とは異なる名前を付けて、衝突を避けることです。

問題は、関数内で「kettles」オブジェクトがローカルの「this.kettles」オブジェクトを参照することですが、それが定義されている場合のみです。そうでない場合は、「_global.kettles」オブジェクトを参照します。これにより、OnLoad の設定動作が予測しにくくなります。

于 2009-01-24T06:56:00.057 に答える
0

スコープに関する提案はほとんどありません。変数currentTimeline=_level0(またはlevelN)を作成し、onLoad関数の成功セクション内で使用し、名前の競合を避け、厳密に必要な場合にのみ_globalを使用できます。

于 2009-01-24T13:17:07.760 に答える
0

助けてくれてありがとう - LoadVars() が非同期関数であり、スクリプトの残りの部分が読み込まれたかどうかを確認せずに続行する前にクリックしませんでした。

各フレームで loadVar が完了したことを確認し、loadVar が完了した後にコードを実行することで、これを修正することができました。

テスト用にswfをコンパイルしました(コマンド+リターン)。

于 2009-02-02T00:18:07.953 に答える
0

ここにはスコープの問題がある可能性がありますが、その方法がわかりません

before: kettles (global) = 43

まだ load を呼び出していません。と

after: kettles (global) = 43

ロードは非同期で実行されるため、おそらくどちらも機能しないはずです。Flash Player が再生の間に _global 変数をキャッシュしているように思われますが、それが起こったという話は聞いたことがありません。これをどのように構築していますか?毎回 Flash IDE で swf をコンパイルしているだけですか?

そして、そうです、スコーピングとこれについて David が言ったこと、特に一貫性を保つためにケトルだけでなく this.kettles をトレースするという点で。

于 2009-01-27T07:08:15.200 に答える