WEB开发网
开发学院网页设计JavaScript Javascript中currying的实现 阅读

Javascript中currying的实现

 2010-09-14 13:39:36 来源:WEB开发网   
核心提示:本文示例源代码或素材下载 Currying好像是函数式语言都有的一个特性,比如Perl,Python,Javascript,Javascript中currying的实现,那么到底什么是Currying,我是在学习Closure时无意中接触到这个定义的,对于前面的 add 函数,我们可以这样来调用:console

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

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)());

运行时截图:

Javascript中currying的实现

Tags:Javascript currying 实现

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接