0

次のコードは、ループ内の最後のウィジェットのみをすべてのリスナー関数に追加します。すべての関数は、最後のオブジェクトでtoggleShow()を呼び出します。

なぜこれが発生するのですか?また、各Widgetオブジェクトを対応する関数で参照する方法はありますか?

for each (var w:Widget in workspace.getWidgetList()) {
    var widgetShow:NativeMenuItem = menu.addItem(new NativeMenuItem("Show " + w.title)); 
    widgetShow.addEventListener(Event.SELECT, function():void {
        w.toggleShow();
    }); 
}
4

1 に答える 1

1

これを関数にします。これは、ループが最後まで実行され、wがそのリストの最後の要素になるために発生します。したがって、無名関数が呼び出されると、常に最後の要素が使用されます。

for each (var w:Widget in workspace.getWidgetList()) {
   addMenuItem(w);
}

function addMenuItem(w:Widget):void
{
    var widgetShow:NativeMenuItem = menu.addItem(new NativeMenuItem("Show " + w.title)); 
    widgetShow.addEventListener(Event.SELECT, function():void {
        w.toggleShow();
    }); 
}
于 2012-07-09T14:15:49.303 に答える