Javascript中currying的实现


本文示例源代码或素材下载

  Currying好像是函数式语言都有的一个特性,比如Perl,Python,Javascript。

  那么到底什么是Currying,我是在学习Closure时无意中接触到这个定义的,觉得很是有趣。

  先看看 Wiki 中的定义:

  Curryingis the technique of transforming afunctionthat takes multiplearguments

  in such a way that it can be called as a chain of functions each with a single argument.

  大概的意思就是说,将拥有多个参数的函数Currying化为拥有单一参数的函数形式。

  下面举一个简单的例子说明Javascript
中的Currying实现,一个简单的求和函数:

functionadd(x,y){
  returnx+y;
}
console.log('add(2,3)=='+add(2,3));

  对其进行Currying,及调用方法:

functioncurry_add(x){
  returnfunction(y){
    returnx+y;
  }
}
console.log('curry_add(2)(3)=='+curry_add(2)(3));

  注意,curry_add(2) 返回的是函数。

  我们还可以定义一个通用的 curry 函数:

functioncurry(fn){
  varargs=[];
  for(vari=1;i<arguments.length;i++){
    args.push(arguments[i]);
  }
  returnfunction(){
    for(vari=0;i<arguments.length;i++){
      args.push(arguments[i]);
    }
    returnfn.apply(window,args);
  }
}

  这个函数至少接收一个参数(需要curry的函数),对于前面的 add 函数,我们可以这样来调用:

console.log('curry(add)(2,3)=='+curry(add)(2,3));
console.log('curry(add,2)(3)=='+curry(add,2)(3));
console.log('curry(add,2,3)()=='+curry(add,2,3)());

  因为 curry(add, 2) 或 curry(add) 返回的还是函数,所以我们还可以对其进行Currying,如下代码:

console.log('curry(curry(add),2)(3)=='+curry(curry(add),2)(3));
console.log('curry(curry(add,2),3)()=='+curry(curry(add,2),3)());

  运行时截图:


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3