2016-11-15 89 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)实现。