partial
別の関数を定義できます。追加の引数を関数にバインドする関数を呼び出しましょう。
function partial( func : Function, ...boundArgs ) : Function {
return function( ...dynamicArgs ) : * {
return func.apply(null, boundArgs.concat(dynamicArgs))
}
}
次に、関数を次のように変更します。
private function formatDate( dataField : String, item : Object, column : DataGridColumn ) : String {
var df : DateFormatter = new DateFormatter();
df.formatString = "MM/DD/YY";
if ( column.dataField == dataField ) {
return df.format(item[dataField]);
}
return "ERR";
}
引数リストに firstという新しい引数を追加し、dataField
「startDate」へのすべての参照をその引数に置き換えたことに注意してください。
そして、次のように使用します。
var startDateLabelFunction : Function = partial(formatDate, "startDate");
var endDateLabelFunction : Function = partial(formatDate, "endDate");
関数は、新しい関数へのパラメーターと連結されたパーシャルへの呼び出しからのパラメーターを使用して元のpartial
関数を呼び出す新しい関数を返します...あなたと一緒にいますか? 別の言い方をすれば、N 個の引数が特定の値に事前にバインドされている新しい関数を返すことができるということです。
順を追って説明しましょう。
partial(formatDate, "startDate")
次のような関数を返します。
function( ...dynamicArgs ) : * {
return func.apply(null, boundArgs.concat(dynamicArgs));
}
しかし、func
とboundArgs
は に引数として渡したものなpartial
ので、次のように言えます。
function( ...dynamicArgs ) : * {
return formatDate.apply(null, ["startDate"].concat(dynamicArgs));
}
これは、呼び出されると、多かれ少なかれこれと同じになります
function( item : Object, column : DataGridColumn ) : * {
return formatDate("startDate", item, column);
}
多田!