[JavaScript]単純なコールバック関数を簡単に記述できる関数
- 2007-12-13
- カテゴリ: Client Side
- タグ: Tips JavaScript 安易な発想 関数型
あらかじめ定義しておくと少し便利かもしれない。
function $FN(fn) {
return (typeof fn == 'function') ? fn : Function('x', 'return ' + fn);
}
引数が関数であればそのまま返し、文字列であれば、function anonymous(x) { return 引数 }という無名関数に変換して返す関数。
簡単な使い方は↓のとおり。
var fn = $FN('x + 1');
window.alert(fn(1)); //2
この例では、function(x) { return x + 1; }が$FN('x + 1')に短縮されたというメリットしか感じ取れないかもしれない。
しかし、単純なコールバック関数を引数として受け取る関数に、この$FNを使っておくとかなり便利だと思う。
function someFunc(callback) {
callback = $FN(callback);
return callback(2);
}
someFunc('x + 2'); //4
someFunc(function(x) { return x + 2; }); //4
コードがかなりすっきりするのがわかると思う。
prototype.jsの$関数と同様に、既に目的の型だった場合はそのまま返すようにしているので、上のsomeFuncのように関数に埋め込んでおけば、関数型も文字列型も両方受け取れる関数が作れるはず。
普及してくれないかなー
実は
この関数の着想はjQueryのmap関数から。
// If a string is passed in for the function, make a function
// for it (a handy shortcut)
if ( typeof fn == "string" )
fn = eval("false||function(a){return " + fn + "}");
本当にa handy shortcut
だと思う。
jQueryのほうではevalを使っているが、evalだとIE向けのハックが必要になるので、普通にFunction関数を使って関数を生成するようにしてみた。
ついでに
↓これぐらい用意しておけば十分かな…
function $FX(fn) {
return (typeof fn == 'function') ? fn : Function('x', 'return ' + fn);
}
function $FXY(fn) {
return (typeof fn == 'function') ? fn : Function('x', 'y', 'return ' + fn);
}
function $FXYZ(fn) {
return (typeof fn == 'function') ? fn : Function('x', 'y', 'z', 'return ' + fn);
}
Function関数(or コンストラクタ)は意外と知られていないけど、便利だと思う。
トラックバックURL
- http://liosk.blog103.fc2.com/tb.php/64-0f6c6411

