- ベストアンサー
「this」の使いどころ
こんにちは。 素朴な疑問なんですが、「this」ってどんな場面で使えばいいんでしょうか? 昔はムービークリップや関数も「this.test_mc.testC_mc...」「this.test()」 とthisを付けて書いていたのですが、私は今はあまり使いません。 this[id+"_mc"]のように配列アクセス演算子を使う場合には使わなければならないですが。 なんでもかんでもthisをつけていたら見栄えが悪い感じがします。 皆さんはどのようなときにthisを使っていますか? よろしくお願いします。できるだけたくさんの方に答えて頂けると嬉しいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
> 「this」ってどんな場面で使えばいいんでしょうか? this が示すものが ActionScript3.0 と 2.0以下とでは違うと聞きますから, それぞれの使い方も変わるとは思いますが, 私は AS3 のことはよくわかりませんので 2.0以下 の例ということで。 ◎ this を使用しなければならない例 新規ドキュメントを作成して, フレーム1 に次のスクリプトをコピペし, 「制御」→「ムービープレビュー」。 -------------------------------------- for (i=0; i<=4; i++) { this.createTextField("_txt"+i, i, 10, 10+i*30, 0, 0); this["_txt"+i].text = "ココをクリック!"; this["_txt"+i].autoSize = true; this["_txt"+i].onSetFocus = function() { //↓★ this を使用しなければならない this.text = "クリック完了"; }; } -------------------------------------- //↓★ this を使用しなければならない this.text = "クリック完了"; の部分は, this["_txt"+i].text = "クリック完了"; でも, _root["_txt"+i].text = "クリック完了"; でも _parent["_txt"+i].text = "クリック完了"; でも無事に動作しません。 this であるべきです。 現象は少し変わりますが仮に次のようにしても結局同じです。 やはり this であるべきです。 -------------------------------------- for (i=0; i<=4; i++) { var TF = _root.createTextField("_txt"+i, i, 10, 10+i*30, 0, 0); TF.text = "ココをクリック!"; TF.autoSize = true; TF.onSetFocus = function() { //↓★ this を使用しなければならない this.text = "クリック完了"; }; } -------------------------------------- 一方,逆の場合もあります。 つまり this が使えない場合もあります。 ◎ this を使用できない例 message=abcdefg というデータをテキストエディタで用意して, 任意のフォルダに, 「data.txt」 というファイル名で保存します。 そのフォルダ内にFlashの新規ドキュメントを保存し, フレーム1 に次のスクリプトをコピペし, 「制御」→「ムービープレビュー」。 -------------------------------------- // _root に インスタンス名_txt のテキストフィールドを作成 _root.createTextField("_txt", 0, 20, 30, 0, 0); // テキストフィールドを自動サイズにする _txt.autoSize = true; // --- // LV という LoadVarsインスタンスを作成 var LV = new LoadVars(); // ロード完了時の動作 LV.onLoad = function() { // ↓★this の使用は不可 _txt.text = LV.message; }; LV.load("data.txt"); -------------------------------------- // ↓★this の使用は不可 _txt.text = LV.message; の部分は, this._txt.text = LV.message; でも this._parent._txt.text = LV.message; でも無事に動作しません。 this は使えません。 一方 _root は使えますから, _root._txt.text = LV.message; は大丈夫です。 上の this でなければならない例と, 下の this は使用できない例の2例を書きました。 もしかしたら,なぜそうなのかよくわからないかもしれません。 しかし良く考えたり,調べると, なぜ上のような現象が起こるのかがわかります。 簡単に触りだけの理由を書くと, 上の例は 「i が変動するから」 です。 下の例は 「LoadVarsインスタンス はオブジェクトではあってもムービークリップではないから」 です。 this を使ったときの格好というよりも, 使うときは this が何を指すのかを常に意識して使った方が良いです。 this を使わなければならない場合は当然使いますし, どっちでも良い場合は理論上どちらが相応しいかで決めます。 どちらが相応しいかは周りのスクリプトによって決まる場合も多々あります。
その他の回答 (2)
- 15mm
- ベストアンサー率65% (65/100)
他ムービークリップにfunctionを渡す場合、 thisを付けるかつけないかでfunction内での変数の参照における基準パスが変わってて しばらく気づかずに四苦八苦していた記憶があります。 一応サンプル。 this.createEmptyMovieClip("mc",0); mc.a="値1"; var a="値2"; mc.f=function(){trace([this.a,a]);};//←ここのthisの有無 mc.f(); (出力) 値1,値2
お礼
確かにいろいろなところから同じ関数を参照するときは困りますね。 他の言語にはない概念なので難しいですよね。 ありがとうございました。
- Tanigucchi
- ベストアンサー率70% (43/61)
分業してswfを作る場合,再利用される可能性のあるswfの場合は、 外部swfから呼び出される可能性を考慮して相対パスで 指定する必要があります。 (ご存知のとおり絶対パスで記述すると問題があります。) その場合は、thisを多用することになります。
お礼
なるほど、読み込まれる可能性があるswfだとrootじゃ駄目ですもんね。 ありがとうございました。
お礼
なるほど。とても興味深いです。 thisを使えない場合、thisしか使えない場合、面白いですね。 ありがとうございました。