关于JS函数柯里化

1.js函数柯里化有什么好处呢?感觉看了一些网站的讲解还是很模糊,比如:

function add(a, b) {
    return a + b;
}

function curryingAdd(a) {
    return function(b) {
        return a + b;
    }
}

add(1, 2); // 3
curryingAdd(1)(2); // 3

都可以实现add功能,那柯里化的好处在哪呢?

2.什么情况下要用柯里化呢?最好能举一些简单易懂的例子。

阅读 2.9k
4 个回答

curry函数可以接受一个函数,我们暂且称之为原始函数,返回的也是一个函数,柯里化函数,这个返回的柯里化函数功能十分强大,他在执行的过程中,不断的返回一个贮存了传入参数的函数,直到触发了原始函数执行的条件。这么说比较概括,那么就举个例子来说明一下:

原始函数:

    var add = (x, y) => x + y

柯里化函数:

    var curryAdd = curry(add)

这个add需要两个参数,但是我们的curryAdd执行可以传入更少的参数,当传入的参数少于add需要的参数的时候,add函数并不会执行,curryAdd就会将这个参数记下来,并且返回另外一个函数,这个函数可以继续执行传入参数,我们会有一个变量专门记录传入参数的情况,如果传入参数的总数等于add需要参数的总数,我们就激活了原始参数执行,就会返回我们想要的结果。

    // 此时只传入了一个参数 根据判断返回的是一个函数
    var add2 = curryAdd(2)
    // add2 = function(...) {}
    // 此时累计传入了两个参数 等于了add需要参数的总和 所以返回的是一个结果
    // 相当于执行了add(2)(3)
    var result = add2(3)
    // result = 5

curry的原理实现可以看我写的文章

按我理解,其中一个好处是基本的逻辑应用于不同的类型,比如整数相加,或者两个对象的某个属性相加,就可以复用curryingAdd,重写里面的具体add方法(这个add作为curryingAdd的一个参数)就行,但是这好像相当于重载吧,和柯里化有啥关系。。。。
提升一个层面,柯里化就是把多个参数分步骤传入。

我今天下午也刚好在看这个知识点,我的感受是函数柯里化的目的主要是可以将一个复杂的函数分解成几个功能单一的函数,然后通过一个柯里化函数来构建最终的函数。而不是像你上面的代码那样,

function(){
   return function(){
    ...return许多次
      return function(){
      }
   }
}

写出类似“回调地狱”的函数。

推荐问题
宣传栏