函数式编程

什么是函数式编程

函数式编程(functional programing)是编程范式之一。我们常见的范式还有面向过程、面向行为、面向对象等。

纯函数

  • 相同的输入会得到相同的输出,而且没有任何可观测的副作用。
// 可以做缓存
function memoize (fn) {
  const obj = {}
  return function (...args) {
    const key = args.join('-')
      if(obj.hasOwnProperty(key)) {
        return obj[key]
      } 
    const result = fn(...args)
      
    obj[key] = result
    return result
  }
}

闭包

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用
域之外执行。

  • 缓存 上面缓存的方法就是用到了闭包
  • 模块化
// 模块化
(function(win) {
  var obj = {}
  win.define = function (key, fn) {
    obj[key] = fn()
  }
  win.require = function (key, fn) {
    fn(obj[key])
  }
})(window)

define('q', function(){
  return {
    log: console.log
  }
})

require('q', function(q) {
  q.log(123)
})

高阶函数

参数是一个函数,会返回一个新函数
curry,compose,memoize都是高阶函数

柯里化

function add (a, b, c, d) {
  return a + b + c + d
}

function curry (fn, ...args) {
  return function(...rest) {
    const params = [...args, ...rest]
    return params.length >= fn.length 
      ? fn.apply(fn, params) 
      : curry.call(curry, fn, ...params)
   }
}

const newAdd = curry(add)
newAdd(1)(2)(4)(3) // 10
newAdd(1, 2, 3, 4) // 10
newAdd(1, 2, 3)(4) // 10

  • curry是一个高阶函数
  • 对函数进行改造,可以传入部分参数返回一个新函数,等待剩余参数传入最后执行。

函数组合

function add2 (num) {
  return num + 2
}

function multiply2 (num) {
  return num * 2
}

function del2 (num) {
  return num - 2
}

function compose (...fns) {
  return function (...args) {
    return fns.reverse().reduce(function (a, b) {
      return typeof a === 'function' ? b(a(...args)) : b(a)
    })
  }
}

const newFn = compose(
  del2,
  multiply2,
  add2
)

newFn(10) // 22
  • compose是一个高阶函数
  • 将多个函数组合成一个新函数,一般是从右向作执行
  • 参数中除了第一个执行的方法,别的方法只能接受一个参数,这个时候就需要使用柯里化来配合

函子

一个容器(用一个普通对象来实现),包含了任意类型的值,这个对象具有map方法,用来操作里面的值。一般也具有一个of方法,来代替new完成实例化。

del2(multiply2(add2(10)))

compose(
  del2,
  multiply2,
  add2
)(10)

// 在函数式编程的思维中期望这样实现
Functor.of(10).map(add2).map(multiply2).map(del2)

function Functor(val){
    this.val = val;
}

Functor.prototype.map=function(fn){
    return new Functor(fn(this.val))
}

Functor.of = function(val) {
    return new Functor(val)
}
// Functor就是一个函子

常用的库

ramda
lodash
react16.8
rxjs

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在前端快速发展的今天,如果不能时刻保持学习就会很快被淘汰。分享一下最近学习的函数式编程的相关知识,希望对大家有所帮...
    gongyexj阅读 4,336评论 0 0
  • #### 函数式编程 #### 函数式编程总结 1. 认识函数式编程 2. 函数复习 (1)函数是一等公民 ...
    爵迹01阅读 3,818评论 0 1
  • [toc] 第一部分 函数式思想 第 1 章 走近函数式 函数式思想什么是函数式编程以及为什么要进行函数式编程不变...
    TWLESVCNZ阅读 4,108评论 0 1
  • 文章内容输出来源:拉勾教育大前端高薪训练营 和自我总结 学习函数式编程的意义 1.受React的流行而被人们越来越...
    油菜又矮吹阅读 3,192评论 0 0
  • 目录 [TOC] 课程介绍 为什么要学习函数编程以及什么是函数编程 函数式编程的特性(纯函数、柯里化、函数组合等)...
    A_走在冷风中阅读 803评论 0 0

友情链接更多精彩内容