前端进阶之---柯里化【函数式编程】

柯里化到底是什么?

维基百科上说道:柯里化,英语:Currying(果然是满满的英译中的既视感),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数而且返回结果的新函数的技术。

看这个解释有一点抽象,我们就拿被做了无数次示例的add函数,来做一个简单的实现。

// 普通的add函数
function add(x, y) {
    return x + y
}

// Currying后
function curryingAdd(x) {
    return function (y) {
        return x + y
    }
}

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

实际上就是把add函数的x,y两个参数变成了先用一个函数接收x然后返回一个函数去处理y参数。现在思路应该就比较清晰了,就是只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。

柯里化的特点:

  1. 参数复用(固定易变因素)
  2. 延迟执行
  3. 提前返回

柯里化的缺点

柯里化是牺牲了部分性能来实现的,可能带来的性能损耗:

  1. 存取 arguments 对象要比存取命名参数要慢一些
  2. 老版本浏览器在 arguments.lengths 的实现相当慢(新版本浏览器忽略)
  3. fn.apply() 和 fn.call() 要比直接调用 fn() 慢
  4. 大量嵌套的作用域和闭包会带来开销,影响内存占用和作用域链查找速度

柯里化的应用

  • 利用柯里化制定约束条件,管控触发机制
  • 处理浏览器兼容(参数复用实现一次性判断)
  • 函数节流防抖(延迟执行)
  • ES5前bind方法的实现

函数式编程

柯里化

f(x)g(x)合成为f(g(x)),有一个隐藏的前提,就是fg都只能接受一个参数。如果可以接受多个参数,比如f(x, y)g(a, b, c),函数合成就非常麻烦。

这时就需要函数柯里化了。所谓"柯里化",就是把一个多参数的函数,转化为单参数函数。


// 柯里化之前
function add(x, y) {
  return x + y;
}

add(1, 2) // 3

// 柯里化之后
function addX(y) {
  return function (x) {
    return x + y;
  };
}

addX(2)(1) // 3

有了柯里化以后,我们就能做到,所有函数只接受一个参数。后文的内容除非另有说明,都默认函数只有一个参数,就是所要处理的那个值。

资料:

https://segmentfault.com/a/1190000017981474https://segmentfault.com/a/1190000017981474详解JS函数柯里化 - 简书第一次看到柯里化这个词的时候,还是在看一篇算法相关的博客提到把函数柯里化,那时一看这个词就感觉很高端,实际上当你了解了后才发现其实就是高阶函数的一个特殊用法。 果然是不管作用...https://www.jianshu.com/p/2975c25e4d71

函数式编程入门教程 - 阮一峰的网络日志https://www.ruanyifeng.com/blog/2017/02/fp-tutorial.html

猜你喜欢

转载自blog.csdn.net/qq_22182989/article/details/122177909