カリー化

メモ

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()をコールした時の引数がマージされている。

面白いなクロージャ