2011.06.09
AS3.0でハマったこと、thisについて。
匿名関数内でthisを使ったら、予想外の動作をしたのでメモしておきます。
「MC」というムービークリップ内に「btn」というボタンを配置し、
フレームには以下のように書きました。
■AS3.0
btn.addEventListener( MouseEvent.MOUSE_UP, function(){
trace(this.x);
});
匿名関数内で this を使用しています。
ここで、this は「MC」を参照するだろうと勝手に考えていたのですが・・
出力結果は undefined 。
「MC」でも「btn」でもありませんでした。
じゃあこの this は何を指しているのかというと、
こちらのサイトでまとめられていました。
AS3のクロージャ
・・はい、AS3.0学びたての自分では、この概念は難しすぎます。
それでも辛うじてわかったことは、
1.この関数はメソッド内で定義されているため「関数クロージャ」に分類され、
2.その関数クロージャは呼び出し方によって参照先が変わり、
3.匿名関数の場合はどのインスタンスにも関連づけられていないためアクティベーションオブジェクトを参照してしまう
ということです。(正直、これすら間違っているかもしれませんが・・)
ですので、this を使ったとしても「MC」を参照できないのでした。
これで困ったのは配列アクセス演算子を使って
this["mc_"+ i].stop();
というような指示をしようとしたとき。
thisを書くとアクティベーションオブジェクトを参照してしまうし、
かといって代わりに書くオブジェクトもない・・
今まで当たり前に使ってきた手法が使えなくなってしまい
かなり混乱しております^^;
何か良い代替方法を見つけたら、また追記しようと思います。
匿名関数内でthisを使ったら、予想外の動作をしたのでメモしておきます。
「MC」というムービークリップ内に「btn」というボタンを配置し、
フレームには以下のように書きました。
■AS3.0
btn.addEventListener( MouseEvent.MOUSE_UP, function(){
trace(this.x);
});
匿名関数内で this を使用しています。
ここで、this は「MC」を参照するだろうと勝手に考えていたのですが・・
出力結果は undefined 。
「MC」でも「btn」でもありませんでした。
じゃあこの this は何を指しているのかというと、
こちらのサイトでまとめられていました。
AS3のクロージャ
・・はい、AS3.0学びたての自分では、この概念は難しすぎます。
それでも辛うじてわかったことは、
1.この関数はメソッド内で定義されているため「関数クロージャ」に分類され、
2.その関数クロージャは呼び出し方によって参照先が変わり、
3.匿名関数の場合はどのインスタンスにも関連づけられていないためアクティベーションオブジェクトを参照してしまう
ということです。(正直、これすら間違っているかもしれませんが・・)
ですので、this を使ったとしても「MC」を参照できないのでした。
これで困ったのは配列アクセス演算子を使って
this["mc_"+ i].stop();
というような指示をしようとしたとき。
thisを書くとアクティベーションオブジェクトを参照してしまうし、
かといって代わりに書くオブジェクトもない・・
今まで当たり前に使ってきた手法が使えなくなってしまい
かなり混乱しております^^;
何か良い代替方法を見つけたら、また追記しようと思います。
コメントする