ActionScript 2.0で関数内のスコープを確かめる [Edit]

ActionScript 2.0における関数内のスコープを、サンプルスクリプトで確かめてみます。this参照がある場合とない場合について、タイムラインの関数とクラスのメソッドでも扱いに少し違いが生じます。なお、このテストは、Flash Professional 8/ActionScript 2.0で行っています。

[1] まず、タイムラインにフレームアクションで関数を定義します(スクリプト001)。この場合、this参照のあるなしによりスコープが異なることについては、「Buttonのthis」をお読みください。

スクリプト001■タイムラインの関数内におけるスコープのテスト
// タイムライン: メイン
// フレームアクション
var scope:MovieClip = this;
var _mc:MovieClip = this.createEmptyMovieClip("my_mc", 1);
_mc.scope = _mc;
_mc.xTest = xTest;
trace("["+this+"]=====");
xTest();
trace("["+_mc+"]=====");
_mc.xTest();
function xTest():Void {
  trace(["default", scope]);
  trace(["this", this.scope]);
  var scope:String = "local";
  trace(["local", scope]);
}

[出力]パネルには、つぎのように表示されます(図001)。

[_level0]=====
default,_level0
this,_level0
local,local
[_level0.my_mc]=====
default,_level0
this,_level0.my_mc
local,local

図001■タイムラインの関数内におけるスコープのテスト結果
FF0803061_001.gif

[2] つぎに、基本的に同じ処理の内容を、クラスとして定義してみます(スクリプト002)。クラスのメソッド内では、参照のない識別子はまずローカルスコープで探され、見つからなければつぎにthis参照が自動的に補われます。クラスにおける参照の扱いとDelegateクラスの使い方については、「インスタンスのプロパティでないのに宣言を求められる」をお読みください。

スクリプト002■クラスのメソッド内におけるスコープのテスト
// ActionScript 2.0クラス定義ファイル: ScopeTest.as
import mx.utils.Delegate;
class ScopeTest {
  public var scope:Object;
  public function ScopeTest(timeline_mc) {
    scope = this;
    var _mc:MovieClip = timeline_mc.createEmptyMovieClip("my_mc", 1);
    _mc.scope = _mc;
    _mc.xTest = xTest;
    _mc.xTest2 = xTest2;
    trace("["+this+"]=====");
    xTest();
    xTest2();
    trace("["+_mc+"]=====");
    _mc.xTest();
    _mc.xTest2();
    trace("[Delegate]=====");
    _mc.xTest = Delegate.create(this, xTest);
    _mc.xTest2 = Delegate.create(this, xTest2);
    _mc.xTest();
    _mc.xTest2();
  }
  public function xTest():Void {
    trace(["default", scope]);
    trace(["this", this.scope]);
  }
  public function xTest2():Void {
    var scope:String = "local";
    trace(["local", scope]);
    trace(["this", this.scope]);
  }
  public function toString():String {
    return "[object ScopeTest]";
  }
}

上記スクリプト002のクラスをテストするには、タイムラインのフレームアクションでコンストラクタを呼出し、タイムラインの参照(this)を引数に渡します。

// タイムライン: メイン
// フレームアクション
new ScopeTest(this);

[出力]結果は、つぎのとおりです(図002)。

[[object ScopeTest]]=====
default,[object ScopeTest]
this,[object ScopeTest]
local,local
this,[object ScopeTest]
[_level0.my_mc]=====
default,_level0.my_mc
this,_level0.my_mc
local,local
this,_level0.my_mc
[Delegate]=====
default,[object ScopeTest]
this,[object ScopeTest]
local,local
this,[object ScopeTest]

図002■クラスのメソッド内におけるスコープのテスト結果
FF0803061_002.gif

コメント

この記事にコメントを書く

記事に対するテクニカルな質問はご遠慮ください(利用規約)。

その他の記事