2016-11-15 126 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,我不知道我在做什麼錯...任何人有一個想法?

回答

3

您有一個差一錯誤的位置:return fn.apply(argstotal)

的第一個參數Function.prototype.apply是範圍之廣,this調用中的值,的第一個參數。如果你要打印出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並且不將其設置爲咖喱功能

第一種選擇可能會更好,因爲它會讓開發人員感到驚訝。您可以實現使用:

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)實現。