• ベストアンサー

as3 変数のスコープについて

xmlの読み込みをしていますが、 最後のtraceで内容が表示されません。nullになります。 var myXML:XML; var imgSrc:String ; var url:URLRequest = new URLRequest("test.xml"); var xmlLoader:URLLoader = new URLLoader(); xmlLoader.dataFormat = URLLoaderDataFormat.TEXT; xmlLoader.load(url); xmlLoader.addEventListener(Event.COMPLETE, comp); function comp(event:Event):void { myXML = XML(xmlLoader.data); imgSrc = myXML.img[0]; } trace(imgSrc);←ここがnullです。 function内でtraceすると問題なく表示されるのですが、 一体どうしてでしょうか。 ご教授お願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

ActionScriptってのはオブジェクト指向で 順次実行型のスクリプトではないですからね xmlのロードが実行されてはじめて imgSrcに値が入るので compの実行を待たずにimgSrcの 中身をみてもnullなのは当然です

trfnc223
質問者

お礼

ご回答ありがとうございます。 すいません、あんま理解していないのですが、 上記の書き方だと、functionが実行される前に traceが実行されているということですよね。。。 もしよろしければ、具体的にどうしたらよいか お聞かせいただけると幸いです。 それとも、function外でimgSrcの値を とる方法はないということでしょうか。。。

その他の回答 (1)

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

> 上記の書き方だと、functionが実行される前に > traceが実行されているということですよね。。。 そうですよ。 xmlLoader.addEventListener(Event.COMPLETE, comp); によってXMLのロード完了時に関数compが実行されます。 当たり前ですが, XMLのロードが完了しないとXMLの内容などわかりません。 XMLのロードが完了して中身を閲覧や操作できるような状態になって 関数compが実行されるということです。 というか, そのために(関数compを即実行させないために) xmlLoader.addEventListener(Event.COMPLETE, comp); を用意しているはずです。 >それとも、function外でimgSrcの値を >とる方法はないということでしょうか。。。 関数comp内で別の関数を実行させて, その別関数の中に trace(imgSrc); を書いておくのも1つの方法です。 また,書かれていらっしゃるスクリプトを書いたフレームで, そのフレームの再生を停止させておいて( stop() させておいて) 関数compの中で次のフレームに進むなどのスクリプトを書いて 次のフレームに trace(imgSrc); を書いておくのも1つの方法です。 例:フレーム1 で XMLをロードし   ロード完了次第 フレーム2 に進めて   フレーム2 以降で本体のスクリプトを動作させる。

trfnc223
質問者

お礼

ご回答ありがとうございました!!!! 大変助かりました! 今回はcomp内に引数を持たせて別のfunctionを呼ぶ 方法で対処いたしました!!! ありがとうございます!

関連するQ&A

専門家に質問してみよう