2016-11-15 16 views
1

がやろうとして何イム私はJavaScriptのカレー/schönfinkeln

function curry(fn) { 
    var args = []; 
    // push everything but function itself into args 
    for (var i = 1; i < arguments.length; ++i) { 
     args.push(arguments[i]); 
    } 
    return function() { 
     var args2 = []; 
     for (var i = 0; i < arguments.length; i++) { 
      args2.push(arguments[i]); 
     } 
     var argstotal = args.concat(args2); 
     return fn.apply(argstotal); 
    }; 
} 

function add(a,b){return a + b}; 

宣言し、次のような機能を持っていると言うことができます明白ですが、私は自分自身の偉大な

どういうわけか
var addCurry = curry(add); 
addCurry(10, 20, 12314) // should deliver 30, gives NaN 

それを作品の追加機能をカレーにしたいですNaNを返すと私はImが間違っているものを知らない...誰もがアイデアを得ましたか? Function.prototype.applyからreturn fn.apply(argstotal)

最初の引数は、スコープ、呼び出し内thisの値は、ない最初の引数である:

答えて

3

現在地off-by-oneエラーを持っています。あなたはカリー化関数内からargumentsを印刷した場合、次のように表示します:を通じて

  1. パスthis

    function curry(fn) { 
     
        var args = []; 
     
        // push everything but function itself into args 
     
        for (var i = 1; i < arguments.length; ++i) { 
     
        args.push(arguments[i]); 
     
        } 
     
        return function() { 
     
        var args2 = []; 
     
        for (var i = 0; i < arguments.length; i++) { 
     
         args2.push(arguments[i]); 
     
        } 
     
        var argstotal = args.concat(args2); 
     
        return fn.apply(argstotal); 
     
        }; 
     
    } 
     
    
     
    function add(a, b) { 
     
        console.log('debug', this, arguments); 
     
        return a + b; 
     
    } 
     
    
     
    var cadd = curry(add, 1); 
     
    cadd(2);

    はあなたが非常に簡単に二つの方法でこの問題を解決することができますカリー化関数に

  2. thisを無視し、カレー風味の機能のためにそれを設定していない
  3. それはより少ない開発者を驚かせるだろうと

最初のオプション は、おそらくより良いです。

function curry(fn) { 
 
    var args = []; 
 
    // push everything but function itself into args 
 
    for (var i = 1; i < arguments.length; ++i) { 
 
    args.push(arguments[i]); 
 
    } 
 
    return function() { 
 
    var args2 = []; 
 
    for (var i = 0; i < arguments.length; i++) { 
 
     args2.push(arguments[i]); 
 
    } 
 
    var argstotal = args.concat(args2); 
 
    return fn.apply(this, argstotal); // <-- only change 
 
    }; 
 
} 
 

 
function add(a, b) { 
 
    console.log('debug', /* this, */ arguments); 
 
    return a + b; 
 
} 
 

 
var cadd = curry(add, 1); 
 
cadd(2);

を第二の選択肢はfn.apply(null, argstotal)で実装することができます:あなたが使用していることを実現することができます。

関連する問題