すぐに使える:この古代のパズルを解くには、エレガントなコードを 2 行追加するだけです。
stage.addEventListener(MouseEvent.CLICK, onClick(true, 123, 4.56, "string"));
function onClick(b:Boolean, i:int, n:Number, s:String):Function {
return function(e:MouseEvent):void {
trace("Received " + b + ", " + i + ", " + n + " and " + s + ".");
};
}
しかし、最も重要なことは、リソースを解放するために後でリスナーを削除する必要がある可能性が非常に高いため、+1 行を変数に格納することです。
var functionOnClick:Function = onClick(true, 123, 4.56, "string");
stage.addEventListener(MouseEvent.CLICK, functionOnClick);
function onClick(b:Boolean, i:int, n:Number, s:String):Function {
return function(e:MouseEvent):void {
trace("Received " + b + ", " + i + ", " + n + " and " + s + ".");
};
}
そして、通常どおり削除できます。
trace("Before: " + stage.hasEventListener(MouseEvent.CLICK));
stage.removeEventListener(MouseEvent.CLICK, functionOnClick);
trace("After: " + stage.hasEventListener(MouseEvent.CLICK));
以下は、その使用法を証明するための、より精巧で動的な例です。
function onClick(s:String):Function {
return function(e:MouseEvent):void {
trace("The square " + s + " at x = " + e.currentTarget.x + "px was clicked");
};
}
var myFunctions:Array = new Array();
for (var i:int = 0; i < 10; i++) {
myFunctions.push(onClick("#" + (i+1)));
}
for (i = 0; i < myFunctions.length; i++) {
var square:Sprite = new Sprite();
square.name = "sqr" + i;
square.addChild(new Bitmap(new BitmapData(20, 20, false, 0)));
square.x = 5 + 25 * i;
square.addEventListener(MouseEvent.CLICK, myFunctions[i]);
stage.addChild(square);
}
動的オブジェクトによるプロパティ、カスタム クラス、緩い関数、スコープの重複はありません。ロジックが期待するとおりです。単に引数を渡すだけです。
すべてのリスナーを適切に削除するには、後で次のようにします。
for (i = 0; i < myFunctions.length; i++) {
square = stage.getChildByName("sqr" + i) as Sprite;
trace("Before (#" + (i+1) + "): " + square.hasEventListener(MouseEvent.CLICK));
square.removeEventListener(MouseEvent.CLICK, myFunctions[i]);
trace("After (#" + (i+1) + "): " + square.hasEventListener(MouseEvent.CLICK));
stage.removeChild(square);
}
IMHOこれは、最も簡単でありながら最も確実な方法です。