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");