一、JavaScript纯函数

定义:(维基百科)
符合以下条件的函数,被称为纯函数

  1. 此函数在相同的输入值时,需产生相同的输出。
  2. 函数的输出和输入值以外的其他隐藏信息或状态无关,也和由I/O设备产生的外部输出无关。
  3. 该函数不能有语义上可观察的函数副作用,诸如“触发事件”,使输出设备输出,或更改输出值以外物件的内容等。

简单的来说:
4. 确定的输入,一定会产生确定的输出。
5. 函数在执行过程中,不能产生副作用。

1.1、副作用

定义:表示在执行一个函数时,除了返回函数值之外,还对调用函数产生
了附加的影响,比如修改了全局变量,修改参数或者改变外部的存储。

1.2、纯函数案列

function foo(n1, n2) {return n1 + n2
}

这就是个纯函数,为什么呢? 1. 有确定的输入(n1和n2) 也有确定的输出 2. 他没有修改任何东西。

var arr = ['a', 'b', 'c', 'd', 'e']
var arr1 = arr.splice(0,2)
console.log(arr1); // [a, b]
console.log(arr); // ['c', 'd', 'e']

那我们来看看splice是个纯函数吗? 明显不是。为什么呢?虽然他有确定的输入和确定的输出。但是他修改了arr这个数组,所以他不是。

var a = 1
function foo() {a = 2
}

这个也不是,他修改了a

var obj = { age: 18 }
function foo(n1) {n1.age = 20
}
foo(obj)
console.log(obj); // { age: 20 }

这个也不是,因为他修改了我们传入的参数

var obj = { age: 18 }
function foo(n1) {return {...obj,age: 20}
}
foo(obj)
console.log(obj); // { age: 18 }

这个就是纯函数了 因为不论你调多少次foo(obj),他的输出都是一样的,obj这个对象是没被改变的。

二、JavaScript柯里化

定义:(维基百科)

  1. 在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化。
  2. 是把接收多个参数的函数变成接收一个单一参数(最初函数的第一个参数)的函数,并且返回接收余下的参数,而且返回结果的新函数的技术。
  3. 柯里化声称 “如果你固定某些参数,你将得到接受余下参数的一个函数”。

比如这样

function foo(n1, n2, n3, n4) {}
foo(1, 2, 3, 4)// 柯里化
function bar(n1) {return function(n2) {return function(n3) {return function(n4) {console.log(n1 + n2 + n3 + n4);}}}
}
bar(1)(2)(3)(4)

我们把foo写成了bar的这种形式,这就是函数的柯里化

那么这有什么好处吗? 虽然bar的这种效率不如foo这种写法,但是他可以只传一部分的参数就可以调用bar了 如bar(1),他不需要传完所有的参数。

我们可以得出只传递给函数一部分参数来调用它,让它返回一个函数去处理剩余的参数过程就是柯里化

2.2、柯里化的作用

  1. 让函数的职责单一

函数式编程中,我们希望一个函数处理的问题尽可能的单一,而不是将一大堆的处理过程交给一个函数来处理,所以我们就可以将每次传入的参数在单一的函数中进行处理处理完后在下一个函数中再使用处理后的结果

function bar(n1) {n1 += 2return function(n2) {n2 += 2return function(n3) {n3 += 2return n1 + n2 + n3}}
}
console.log(bar(1)(2)(3));

类型与这样 我们每一个函数都只处理他里面的内容。

  1. 逻辑的复用
    因为我们不同的函数在出处理不同的逻辑,所以他的复用性就会很好
function foo(n1) {return function(n2) {return n1 + n2}
}
var add3 = foo(3)add3(1) // 3 + 1
add3(2) // 3 + 2
add3(3) // 3 + 3

JavaScript进阶讲解六—>js函数式编程相关推荐

  1. JavaScript进阶(十二)JS 模块化编程规范-CommonJS、AMD、CMD、ES6

    文章目录 一.前言 二.AMD-异步模块定义 三.CMD-同步模块定义 四.CommonJS 规范 五.ES6 六.拓展阅读 一.前言 AMD.CMD.CommonJs是ES5中提供的模块化编程方案, ...

  2. 3万6千字爆肝,前端进阶不得不了解的函数式编程开发,含大量实例,手写案例,所有案例均可运行

    3w6爆肝,前端进阶不得不了解的函数式编程开发,含大量实例,手写案例,所有案例均可运行 认识函数式编程 函数相关复习 函数是一等公民 高级函数 函数作为参数 案例 1,模拟 forEach 案例 2, ...

  3. Python基础(六)—函数式编程(内部函数、闭包、lambda、filter/map/reduce/sorce、偏函数)

    内部函数 Python中函数的作用域由def关键字界定,函数内的代码访问变量的方式是从其所在层级由内向外,若往外直至全局作用域都查找不到的话代码会抛异常. 主要看以下代码的差别~~ "&qu ...

  4. JS函数式编程思维:柯里化、闭包

    偏函数(Partial Application): 探讨柯里化之前,我们先聊一聊很容易跟其混淆的另一个概念--偏函数(Partial Application).在维基百科中,对 Partial App ...

  5. javascript里的偏函数——本质函数式编程+闭包,返回函数

    最终效果: var greet = function(greeting, name) {return greeting + ' ' + name; };var sayHelloTo = _.parti ...

  6. js 函数式编程(一)

    函数式编程,以强调函数使用为主的开发风格,也是一种范式 函数为一等公民 js函数是一个特殊的对象,有很高的灵活性,比如函数返回一个函数,函数闭包,函数作为函数的参数,函数赋给变量,如果某个编程语言的函 ...

  7. JS函数式编程【译】5.3 单子 (Monad)

    单子是帮助你组合函数的工具. 像原始类型一样,单子是一种数据结构,它可以被当做装载让函子取东西的容器使用. 函子取出了数据,进行处理,然后放到一个新的单子中并将其返回. 我们将要关注三种单子: May ...

  8. 【基于JS 函数式编程 -1】什么是函数式编程 | 纯函数 | 命令式与声明式 | 优点

    ⭐️ 本文首发自 前端修罗场(点击即可加入),一个专注 Web 技术.答疑解惑.面试辅导.职业发展的社区. 相关文章 [函数式编程]基于JS 进行函数式编程(一)引入 | 什么是函数式编程 | 函数式 ...

  9. JS函数式编程概念理解:函子(Functor)

    标签(空格分隔): 函数式编程 函子 functor 很多前端在学习函数式编程之前,都会被各种概念折磨的死去活来,本文的重点算是函数式编程之前的一个甜品,重点在如何切入. 函子即Functor是FP( ...

  10. js函数式编程最佳实践 - 持续更新

    函数式编程最佳实践 学习文档 函数式编程术语 数组字串处理 function addString(el){return el + "0"; } var newArr = arr.m ...

最新文章

  1. Service Mesh是大方向,那Database Mesh呢?
  2. 正则表达式——全部符号解释(详解)
  3. Web项目MySQL配置文件运维
  4. Ubuntu使用VNC运行基于Docker的桌面系统
  5. html判断是否在页面,html判断当前页面是否在iframe中的实例
  6. ARM Linux 3.x的设备树
  7. nginx启动报错 :./nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object fi
  8. fpgrowth算法实战 mlib_MLlib--FPGrowth算法
  9. Scratch二次开发——如何创建单独的Scratch作品展示页?
  10. HTML5尚未迎来爆发:标准不统一日益碎片化
  11. 第四天:Spark Streaming
  12. 根据起始日期、起始时间、终止日期、终止时间计算年数
  13. java 节气_java计算某个日期是什么节气(24节气)
  14. 机器人合肥乐博_乐博机器人编程——让机器人陪伴全国儿童成长
  15. SOA,SOAP,RPC,以及 RPC协议与 REST 协议之间的关系(搜狗)
  16. ecw2c理解元数据:使用BigQuery k-means将4,000个堆栈溢出标签聚类
  17. 4.16 使用可选颜色命令调整图像色彩 [原创Ps教程]
  18. 马斯克认错:裁掉他们是我最大的错误,但黑粉们却没能笑太久...
  19. java报表查询 跟 语句查询区别_Java报表FineReport在医院院长查询分析系统中有什么用...
  20. 支持python的交易软件_金字塔V5.02【正式版】(Python 支持) 更新说明

热门文章

  1. Ubuntu:Terminal终端命令
  2. 杀毒软件 对应的进程名称
  3. 使用Google Chrome Frame(谷歌浏览器内嵌框架)解决低版本IE不兼容问题
  4. 模板引擎 Velocity语法
  5. ntsd调试dump文件
  6. vue 圆形 水波_canvas 水滴图、液体进度条、仿加速球、圆球水波图
  7. python爬取百度迁徙数据_python爬虫-动态爬取百度迁徙
  8. html面试要带电脑吗,前端面试巧妙回答浏览器兼容问题
  9. 基于AD9361的ASK调制与解调
  10. 主流影视网站8合一H5视频源码自动更新数据