クロージャに苦労じゃ
class Foo { ... function Bar() { var xml_socket:XMLSocket = new XMLSocket(); var This:Foo = this; xml_socket.onConnect = function( success:Boolean ) { This.OnConnect( success ); } //ほげほげ... } function OnConnect( success:Boolean ) { //ほげほげ... } }
上のようなイベントハンドラの場合に、thisが(Fooではなく)イベント自体やイベントを発生させたオブジェクトを指すので、Fooのインスタンスを外部変数として固定するために外に出す=変数と関数がセットって記憶される=クロージャ、という理解なのだが…。環境を閉じ込めるために外に出すというのが直観的には理解しがたい。
var This:Foo = this;の部分がダサいと思うのだがこれで合っているんだろうか。
ちなみにsetIntervalはグローバル関数だけど、パラメータが渡せるので
function SetCallback( cb_func:Function, interval:Number ) { var TimerId:Number = setInterval( function( This ) { clearInterval( TimerId ); cb_func.apply( This ); }, interval, this ); }
とかやるとメンバ関数が呼べるし、TimerIdもメンバ変数で持たなくていいということにさっき気づいた。