« PreviousNext »

Entry

progressionのfunction(無名関数)内におけるthisのスコープ

progressionで、各キャストオブジェクト内で子キャストを追加する場合は_onCastAddedメソッド内でAddChildしていくことになりますが、下記のように無名関数内でAddChildする場合、第一引数にthisを使用すると正しく動作しません。

protected override function _onCastAdded():void
{
  addCommand
  (
    function():void
    {
      for (var i = 0; i < 3; i++)
      {
        sList.addCommand
        (
          new AddChild(this, _childList[i])
        );
      }
      insertCommand(sList);
    }
  );
}

これは、上記の場合にthisの指すインスタンスがキャストオブジェクトではなく、無名関数が暗黙で変換されて作成されるFuncオブジェクトのインスタンスを指すようになるためです。

この場合、Funcクラスのコンストラクタでscopeを指定するように、

new Func(function():void 
{
  ~省略~
},null, null, null, {scope:this})

という手法を使うことでも対応可能ですが、下記のようにthisの代替となるメンバ変数を
キャストオブジェクト内に定義する方式の方が楽に対応できると思います。

public class myCast extends CastMovieClip
{
  private var _thisMC:CastMovieClip;
  
  public function myCast(initObject:Object = null)
  {
    super(initObject);
    _thisMC = this;
  }
  protected override function _onCastAdded():void
  {
    addCommand
    (
      function():void
      {
        for (var i = 0; i < 3; i++)
        {
          sList.addCommand
          (
            new AddChild(_thisMC, _childList[i])
          );
        }
        insertCommand(sList);
      }
    );
  }
}

※変数定義、初期化処理のコードに関しては、flashDevelopを使用しているのであれば各キャストのテンプレートにあらかじめ上記のようなコードを記述しておけばよいと思います。

以上です。

Page Top

« PreviousNext »