ホーム > AS3, Progression > Progression this の扱い(序) 無名関数, Func, function

Progression this の扱い(序) 無名関数, Func, function

2009 年 7 月 18 日 コメントをどうぞ コメント
ProgressionのCommand時におけるthisの参照の違いと、無名関数におけるブロックスコープとthisの参照について考える。

Progressionクラスを生成し、コンストラクタで”id”を指定します。

this.id = "yaimo";
trace("クラスのid: "+this.id);
//出力:クラスのid: yaimo
trace("普通にthis: "+this);
//出力:[IndexScene sceneId="/index" id="yaimo" name="index" group="null"]

まずはじめに無名関数におけるthisの扱いから、

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private function hoge():void
		{
			var target:MovieClip = new MovieClip();
			trace("普通の関数内でのthis.id: "+this.id);
 
			target.addEventListener(MouseEvent.MOUSE_OUT,function ():void
			{
				trace("無名関数内でのtarget: "+target);
				trace("単純にthis: " + this);
				trace("ではthis.parent: " + this.parent);
				trace("無名関数内でのthis.id: " + this.id);
				trace("無名関数内でのthis.target: " + this.target);
				this.id = "this.idは無名関数内のidとして登録されています。";
				trace("登録後のthis: "+this.id);
			});

出力結果は以下の通り

1.無名関数内でのtarget: [object MovieClip]
2.単純にthis: [object global]
3.ではthis.parent: undefined
4.無名関数内でのthis.id: undefined
5.無名関数内でのthis.target: undefined
6.登録後のthis: this.idは無名関数内のidとして登録されています。


では、無名関数のthisはいったいどこを参照することになるんだろうか。
予想だとthis = function()である無名関数を指してるんだと思う。

  1. ActionScriptではブロックスコープというものがないので無名関数を使用した場合、hoge()のtargetが参照できる。
    (外側のローカル変数を参照できる)

  2. this: [object global] global?Functionクラスってグローバルクラスとして生成されるの?

  3. もし、this.parentがMovieClipならfunctionはtargetの下に存在し、this=fuction()のことだと思ったけどなんか違うみたい。

  4. 無名関数がクラス全体を指してるなら”yaimo”と出るはずだけどもちろん出ない。

  5. もちろんでない。(this=hoge()??なんていう考えを疑った)

  6. グローバルクラスなので、変数をつけ足せちゃうみたい!へんな発見をした。

【まとめ】
無名関数ではthis の正体はなんなのかわかったような分からないような結果だったけど、
無名関数で this 使うとやけどする!!

無名関数でのthis扱いとしては、
"this=クラスの参照"を実装する時は、無名関数の外でローカル変数を定義し、無名関数での使用を推奨。



つづく。

Bookmark and Share

関連する投稿

  1. コメントはまだありません。
  1. トラックバックはまだありません。