JavaScript - 函数柯里化

JavaScript一个有趣的特征是函数可以作为参数和返回值,在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。

  • 说白了,就是柯里化时先传进一部分参数,然后返回调整后的函数。
  • 直接上代码,看看柯里化到底干了什么
function curry(fn){
    let args = Array.prototype.slice.call(arguments,1);
    return function(){
        let innerArgs = Array.prototype.slice.call(arguments);
        let finallArgs = args.concat(innerArgs);
        return fn.apply(null,finallArgs);
    };
}
function sum(a,b,c){
    return a + b + c;
}
curry(sum,1);
  • 调用curry(sum,1)发生了什么?
    • 1.let args = Array.prototype.slice.call(arguments,1);
    • args现在是除了fn之外剩下的参数,也就是说args里面有1
    •     let innerArgs = Array.prototype.slice.call(arguments);
          let finallArgs = args.concat(innerArgs);
      
    • 拼接了args和新函数的参数,也就是说现在finallArgs = [1,新函数的参数]
    • 接下来return fn.apply(null,finallArgs);,返回了fn,并且fn参数是finallArgs
    • 也就是说经过柯里化后,sum被修改为
    function sum(1,b,c){
      return 1 + b + c;
    }
    
  • 同理,我们可以推出curry(sum,1,2)的结果
    function sum(1,2,c){
      return 1 + 2 + c;
    }
    
  • 调用上面两个新函数
console.log(curry(sum,1)(2,3));// 6
console.log(curry(sum,1,2)(3));// 6
总结:柯里化是一个部分求值的过程。
  • 给出配合ES6剩余参数的写法
function curry(fn,...args1){
    return (...args2)=>{
        return fn.apply(null,[...args1,...args2]);
    }   
}

你可能感兴趣的:(JavaScript - 函数柯里化)