kickstamp

きりんさんメモと、しゃちくんノート。ときどきウサギちゃんのらくがき

JavaScriptのFunctionに関してあれこれ(Applyとか部分適用とか)

部分適用

基本

// add :: Number -> Number -> Number
var add = function (a){
            return (function(b){return a + b;});
        }
add(5)(4); // => 9
var add5 = add(5);
add5(4);; // => 9

bindを使うパターン

// add :: Number -> Number -> Number
var add = function (a, b){
            return a + b;
            }
add(5, 4); // => 9
// bind :: object -> a -> function
var add5 = add.bind(null, 5);
add5(4);; // => 9

Apply

可変長引数関数に配列を渡せるように出来る

// display_log :: [a] -> undefined
var display_log =
    function(){
        for(i = 0; i < arguments.length; i++){
            console.log(arguments[i]);
        }};
// 普通の呼び出し
display_log('ねこ', 'いぬ', 'うさぎ');
/*
   ねこ
   いぬ
   うさぎ
=> undefined
*/

// applyを使った呼び出し
// apply :: object -> [a] -> b
var animals = ['にゃんにゃん', 'わんわん', 'うさうさ']
display_log.apply(null, animals);
/*
   にゃんにゃん
   わんわん
   うさうさ
=> undefined
*/

再帰

// factorial :: Number -> Number
// 変数に束縛する形式の関数宣言でも内部の関数に名前をつけると、再帰できる
var factorial = function fac(num){
                    if (num > 0){
                        return num * fac (num -1 );
                    } else{
                        return 1;
                    }
    }
factorial(5); // => 120
// 外側からは参照できない
fac(5); // => ReferenceError: fac is not defined