ActionScrpt3のクロージャのthisオブジェクト

ActionScrpt3のクロージャでは、関数呼び出し時に明示的にthisオブジェクトを指定できる模様。
ArrayにはforEachとmapメソッドが用意されていて、パラメータにクロージャのほかに、クロージャ内でthisオブジェクトとして参照されるオブジェクトを渡すことができる。
下記のようなソースがあったとして、forEachの第二パラメータのthisオブジェクトを省略しているため、クロージャ内では、thisがxやwidthフィールドをもっていないために期待した判定結果にならない。しかもなぜかnull参照のエラーも発生しなかった…

arr.forEach(function (item:HogeClass, idx:int, arr:Array):void {
  if (this.x + this.width + moveSpeed > item.x) {
    bMove = false;
    return;
  }
});

下記のように第二引数にthisを渡すと、期待通りクロージャ内で渡したインスタンスがthisとして参照された。

arr.forEach(function (item:HogeClass, idx:int, arr:Array):void {
  if (this.x + this.width + moveSpeed > item.x) {
    bMove = false;
    return;
  }
},this);

もしくはクロージャ内ではthis.xxxという記述にせず、xxxを直に参照するとレキシカルなスコープになって問題なく参照できた。

arr.forEach(function (item:HogeClass, idx:int, arr:Array):void {
  if (x + width + moveSpeed > item.x) {
    bMove = false;
    return;
  }
});

Functionクラスのcallやapplyを使う場合もパラメータでthisを渡すことができる。

(function(arg:String):void {
  trace(arg + ",width:" + this.width);
}).call(this, "arg");