Activationオブジェクトについてもう少し考えてみましたが
Activationオブジェクトについて考えているとき、「そういえばこれもActivationオブジェクトと関係あったのかな?」と思ったことがあったので、勢いでエントリー。
【こんな状況】
1. 以下のようなTestClassを作成。
class TestClass { private var myProperty:String ="flash"; public function TestClass() { hoge(); } private function hoge():Void { function doTrace():Void { trace (myProperty); } doTrace(); } }
2. FLASHのフレームアクションに以下のように記述し、TestClassインスタンスを生成。
var test:TestClass = new TestClass();
3. パブリッシュすると、出力パネルにundefinedが出力される。
これはhoge()というメソッド内に入れ子の形で定義された関数doTrace()からは、インスタンスプロパティmyProperyを直接参照できないためで、
class TestClass { private var myProperty:String ="flash"; public function TestClass() { hoge(); } private function hoge():Void { var myProp:String = myProperty; function doTrace():Void { trace (myProp); } doTrace(); } }
のように、関数hoge()の定義前で一時的に変数にプロパティを代入し、その変数を参照するか、または
class TestClass { private var myProperty:String ="flash"; public function TestClass() { hoge(); } private function hoge():Void { var scope:Object = this; function doTrace():Void { trace (scope.myProperty); } doTrace(); } }
のように、スコープとなるオブジェクトを変数に代入し、その変数に格納したスコープ(this)でプロパティを取得する方法があると思います。
またメソッド内で入れ子にされた関数からは、プロパティだけではなく、入れ子の外に定義されている別のメソッドも直接参照できないのですが、上記の方法で解決することができますよね。
class TestClass { private var myProperty:String ="flash"; public function TestClass() { hoge(); } private function hoge():Void { var scope:Object = this; function doTrace():Void { scope.hogehoge(); } doTrace(); } private function hogehoge():Void { trace ("hogehoge"); } }
で、何が申したかったのかと言いますと、これもActivationオブジェクトと関係があるのかなぁーとか考えていたのですが、上記のhogehoge()の参照のこととかを考えると、ローカル変数の問題だけとも言えないようなので、やっぱりスコープの問題のような気もしているという、なんとも締りのないまとめ方になってしまいました。