本帖最后由 jonzrj 于 2014-03-12 10:44:10 编辑

解决方案 »

  1.   

    关键是args, 用到一个叫闭包的概念。function lev1(a1,a2,a3,a4){

    }
    var lev2 = curry(lev1,'AA','BB');
    lev2('add3','add4');
      

  2.   


    function curry(fn){
    var args = Array.prototype.slice.call(arguments, 1);//將curry的參數除fn外組成一個數組
    return function(){
    var innerArgs = Array.prototype.slice.call(arguments), //這里的arguments是指此匿名函數的參數列表,非curry的
    finalArgs = args.concat(innerArgs);//將curry除fn外的參婁與匿名函數的參數組成一個新的數組
    return fn.apply(null, finalArgs);
    };
    }
    var a = curry(function(m, n){alert([m, n].join(' '))}, 'I am');
    a('here');
      

  3.   

    innerArgs 是return function(){}这个匿名函数的参数转成数组的结果,不要搞错了。
      

  4.   

    curry的用处是接受一个函数(fnA),还有想为这个函数预置的参数(preArgs),返回一个已经预置了参数的新函数(fnCurry)。
    传入新函数(fnCurry)的参数(otherArgs)会通过concat和预置参数合并,然后再传到最开始的那个函数(fnA)里执行。
      

  5.   

    闭包的简单应用。如果不了解,你思考下curry(fn,a1,a2)(b1,b2)执行过程。