- ベストアンサー
イベントハンドラメソッドが実行される?
- イベントハンドラメソッドが実行されるのか理解できない状況について教えてください。
- lis.onLoadInitがなぜ実行されるのか、疑問に思っています。
- lisがローカル変数であるため、lis.onLoadInitが実行されないと思われますが、実際には実行されています。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
lis.onLoadInit には、function キーワードで作った匿名関数の参照が入っています。 lis が startLoad 関数の終了とともに消え、それに伴い lis.onLoadInit も無効になっても、この匿名関数そのものは削除されません。 同様に、変数 mcLoader には、new MovieClipLoader(); で作成した MovieClipLoader オブジェクトの参照が入っています。 mcLoader は startLoad 関数が終了した時に消えてしまいますが、メモリ内のどこかに作られた MovieClipLoader オブジェクトの本体は消えません。 startLoad 関数内では、lis.onLoadInit や mcLoader に記録されている参照を使って、”MovieClipLoader オブジェクトの本体に”「読み込みが完了したら、指定の関数を呼び出すように」と指示を出します。 MovieClipLoader オブジェクトの本体と匿名関数は startLoad 関数が終了してもメモリのどこかに存在しており、オブジェクトは指示に従って活動を続けます。 ですから、startLoad 関数が終了して lis や mcLoader が削除されても、読み込みやイベント処理関数は問題なく実行されるというわけです。 ポイントは、lis と mcLoader 自身がイベント発生時に呼び出される関数と読み込みを実行するオブジェクトなのではない、という点です。 イベントハンドラに登録する関数と MovieClipLoader オブジェクトの本体はメモリのどこかに作られており、lis や mcLoader はただ、その所在を知っていて取次ぎをしているだけなのです。 匿名関数が startLoad 関数終了後も存在していることは、次のようにすると確認できます。 (↓ 各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください) //*** //関数の参照を保持する変数 var test:Function; function startLoad():Void { var container:MovieClip = createEmptyMovieClip("container", getNextHighestDepth()); var mcLoader:MovieClipLoader = new MovieClipLoader(); var lis = new Object(); //リスナーと変数に匿名関数の参照を記録する lis.onLoadInit = test = function() { trace(1); }; mcLoader.addListener(lis); } startLoad(); //変数testに格納されている関数を呼び出してみる test(); ***// 「ムービープレビュー」で確認してみてください。 loadClip を省略しているため読み込みは行われず、lis.onLoadInit に記録されている匿名関数は MovieClipLoader のイベントハンドラからは呼び出されません。 匿名関数は1度だけ、最後の test(); により呼び出されます。 ----- new MovieClipLoader(); で作ったオブジェクトや lis.onLoadInit に記録された匿名関数は startLoad 関数が終了した後でも存在はしていますが、その所在を知っていたのは、ローカル変数の mcLoader と lis.onLoadInit だけです。 従って、この所在を誰か他の者にも伝えておかない限り、startLoad 関数の終了とともにオブジェクトと匿名関数の所在を知る者がいなくなり、2度とアクセスできなくなってしまいます。 上記のスクリプトでは、匿名関数の場所をタイムラインが持っている変数である test にも記録しているので、startLoad 関数の外でも呼び出すことができます。
その他の回答 (1)
- BlurFiltan
- ベストアンサー率91% (1611/1754)
変数 「lis」 は 「new Object()」 で作成したオブジェクト(インスタンス) への参照が代入されています。 オブジェクトはオブジェクトです。 わかりますでしょうか。 ---例---------------------------- 東京都町田市に 田中じゅげむ じゅげむ ごこうのすりきれ 氏 という人がいたとします。 田中じゅげむ じゅげむ ごこうのすりきれ 氏では言いにくいですし文字数もかさばるので 以降, この 田中じゅげむ じゅげむ ごこうのすりきれ 氏のことを 「lis 氏」 ということにします。 私は 「lis 氏」 に 「明日,午前中の郵便局へ行ってね。」 と言いました。 「lis 氏」 は絶対にお願いをきいてくれる人です。 本当に 「lis 氏」 は良い人です。 そんな良い 「lis 氏」 のことを 「lis 氏」 と呼ぶのは申し訳ないので 今後 「lis 氏」 のことを 「lis 氏」 というのはやめにしましょう。 ---------------------------------- この翌日, 田中じゅげむ じゅげむ ごこうのすりきれ 氏 は午前中に郵便局に行くと思います。 仮称や略称が 「lis 氏」 であれ何であれ, 私は 田中じゅげむ じゅげむ ごこうのすりきれ 氏 に郵便局に行くように頼んだのですから。
お礼
分かりやすい比喩をありがとうございます。