カリー化
メモ
function bindArguments(f){ var boundArgs = arguments; return function(){ var args = []; for(var i = 1; i < boundArgs.length; i++) args.push(boundArgs[i]); for(var i = 0; i < arguments.length; i++) args.push(arguments[i]); return f.apply(this, args); }; }
ある本に載っていたカリー化のサンプルコード。
最初bindArguments()を呼び出すときにカリー化というものが起きるのかと思い、そういうつもりでコードを読んでいたが意味がわからなかった。でも本当はbindArguments()が返す関数オブジェクトをコールすることにこのコードの意図があったんだね。
var f1 = function(){ return arguments; } var f2 = bindArguments(f1, 1, 2); // この時点ではf2に関数オブジェクトが返るだけ。 var ret = f2(3, 4); // f2()を呼び出すと面白いことが起きる。 ret; // => [1, 2, 3, 4] bindArguments()をコールした時に渡した引数とf2()をコールした時の引数がマージされている。
面白いなクロージャ。