2011-12-06 14 views
0

変数globalThisからローカルスコープを持つlocalThisと比較して関数にアクセスできない理由を理解したいと思います。localscopeで変数が関数にアクセスできますが、この例ではグローバルスコープではありません

class MyClass extends MovieClip 
{ 

    var globalThis:MovieClip ; 

function MyClass() 
{ 

    var localThis = this ; 

    globalThis = this ; 

    submit_Btn.onPress = function() 
    { 

    localThis.process(); // THIS WORKS GOOD ! 

     globalThis.process() ; // WHY THIS DOESNOT WORK ?????? 

     } 



} 

    function process() 
    { 
     trace("Welcome to the function named process()") ; 
    } 
} 
+0

MyClass(globalThis).process()を試したことがありますか、メンバーをこのように宣言しましたか:var globalThis:MyClass? – AsTheWormTurns

+0

なぜ、submit_Btn.onPressをprocess()に設定して中間の人物を切り取ってみませんか? –

答えて

0

localThis.globalThis.process()に電話すると機能します。

+0

いいえ、うまくいきません! : –

+0

とpublic var globalThis:MovieClip; :) – Kodiak

0

理由は、インライン関数を作成するときにクロージャを作成するか、activation objectです。このアクティベーションオブジェクトにはスコープがあり、作成した関数本体に限定されています(作成する関数自体はClassインスタンスのアクティベーションオブジェクトにあり、すべてを見ることができます)。

+0

インライン関数?インライン関数はありません!! –

+1

submit_Btn.onPress = function()...これはインライン関数です。私は気づいていませんでしたが、これはAS2の質問でした。なぜAS2がそれをするのかを誰が知っていますか?その言語には全く論理はありません。 –

+0

ああ、完全にその1つを逃した。ごめんなさい。私が勉強しているすべての流体力学でなければなりません:P –

0

シンプルです。あなたが一方globalThis

用タイプMovieClipを指定して

var globalThis:MovieClip; 

お知らせを宣言し、あなたはいわゆるバリアント型としてlocalThisを宣言しました。

つまり、globalThisは厳密に型指定された変数ですが、これは緩く型付けされた変数を意味します。コンパイラはprocessメソッドが緩く型付けされたインスタンスのメンバであるかどうかを確認しませんが、globalThisの場合はそうします。

今、あなたはglobalThisが実際にprocessの定義を持っていないMovieClipであることがわかります。これはあなたのMyClassクラスで定義することに注意してください。あなただけのMyClass(globalThis).process();としてprocessメソッドを呼び出すことができ、var globalThis:MyClass;からvar globalThis:MovieClip;を変更し、それがうまくいく、コンパイラはMyClass

process()の定義が表示されますので、OR。この種のglobalThisからMyClassにキャストされるので、コンパイラーはそれに何も間違いを感じません。

これは範囲の質問ではありませんでした。

+0

私はAS2ではコンパイラがそれほど賢明ではないと確信しています。また、AS2では、MovieClipは動的クラスでしたので、実行時に追加することができます。 –

+0

ああ! AS2タグに気付かなかった: –

+0

うん、私はすぐにそれに取り組むために彼のコードをカットアンドペーストして、それから私は疑問に思っていた... onPressは何ですか?そして、なぜこのクラスはパッケージに含まれていません:p – Frank

関連する問題