⭐️ 本文首发自 前端修罗场(点击即可加入),一个专注 Web 技术、答疑解惑、面试辅导、职业发展的社区。

相关文章

【函数式编程】基于JS 进行函数式编程(一)引入 | 什么是函数式编程 | 函数式编程的优点
【函数式编程】基于JS进行函数式编程(二)高阶函数 | 函数代替数据传递 | 函数是一等公民 | 闭包 | 使用高阶函数实现抽象 | 数组的高阶函数
【函数式编程】基于JS进行函数式编程(三)柯里化 | 偏函数 | 组合与管道
【函数式编程】基于JS进行函数式编程(四)函子 | MayBe函子 | Monad函子

❤️ 现在关注【前端修罗场】,后台回复【666】,即可获取一份【免费的优质学习资料】,一起学习,一起进步~


什么是函数式编程

引入

概念

我们知道,在数学中,函数可以有如下形式:
f(X) = Y ,即一个函数f ,以X作参数,返回输出结果Y。
据此,我们可以归纳一个函数:

  • 函数必须接受一个参数
  • 函数必须返回一个值
  • 函数应该根据接收到的参数(如:X)运行,而不是外部参数/环境(关键)
  • 对于一个给定的X,只会输出唯一的一个Y(关键)

在编程语言中,函数式编程是一种范式,其能够创建仅依赖输入就可以完成自身逻辑的函数。这保证了当函数被多次调用时仍然返回相同的结果。同时,函数不会改变任何外部环境变量,这也将产生可缓存、可测试的代码。

函数与方法

  • 函数:一段可以通过其名称被调用的代码。它可以传递参数并返回值。
  • 方法:一段必须通过其名称及其关联对象的名称被调用的代码。例如,在对象中定义的函数,就是该对象的方法。

引用透明性

前面我们提到: 对于一个给定的X,只会输出唯一的一个Y。即所有的函数,对于相同的输入,将返回相同的值。这一性质被称为引用透明性
这使得并发代码缓存成为可能。因为,具有引用透明性的函数,只能依赖来自参数的输入,我们可以轻松地用多线程运行这样的代码,没有任何锁机制。

编程范式之 命令式 与 声明式

首先我们要理解什么是命令式,什么是声明式。

  • 命令式:告诉编译器该做什么。即就告诉编辑器“如何做“。如下,这段代码告诉编译器”获取数组长度,循环数组,用索引获取每一个数组元素“。
let array = [1,2,3];
for(i=0;i<array.length;i++)
console.log(array[i]);
  • 声明式:告诉编译器“做什么”。如何做的部分,将被抽象到普通函数(也称”高阶函数,如forEach()“)中。如下代码,我们使用声明式方式改写上面的命令式代码。
let array = [1,2,3];
array.forEach((e)=>console.log(e);)

由此可见,声明式让开发者只需要关注”做什么“部分。而无需关心怎么做。

函数式编程的优点

纯函数

大多数函数式编程的好处来自编写纯函数。

定义: 对给定的输入返回相同的输出的函数。

例如:
let double = (value) => value*2 ;
这是一个简单的纯函数,我们给它一个输入,它返回相同的输出。
可见,纯函数遵循”引用透明性“

同时,纯函数不应该改变任何外部环境变量,即纯函数不依赖任何外部变量。

并发代码

纯函数总是允许我们并发执行代码。因为纯函数不会改变它的环境,这意味这我们不需要担心同步问题。

例如:

let global = "something";
let func1 = (input) => {global="something2";}
let func2 = () => {if(global==="something2"){}}

改写:

let func1 = (input,global) => {global="something2";}
let func2 = (global) => {if(global==="something2"){}} //将global变量作为参数,由此可不依赖外部变量

可缓存

纯函数总是为给定输入返回相同的输出,那么就可以对输出进行缓存。

由此可见,纯函数只专注做一件事!

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

  1. java 函数式编程 示例_功能Java示例 第1部分–从命令式到声明式

    java 函数式编程 示例 功能编程(FP)的目的是避免重新分配变量,避免可变的数据结构,避免状态并全程支持函数. 如果将功能性技术应用于日常Java代码,我们可以从FP中学到什么? 在这个名为&qu ...

  2. 翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 第 4 章:组合函数...

    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...

  3. fp函数式编程_全面了解函数式编程(FP)

    fp函数式编程 This is the other major programming paradigm. If you are interested in Objected oriented pro ...

  4. java 函数式编程 示例_功能Java示例 第8部分–更多纯函数

    java 函数式编程 示例 这是第8部分,该系列的最后一部分称为"示例功能Java". 我在本系列的每个部分中开发的示例是某种"提要处理程序",用于处理文档. ...

  5. 函数式编程 -- 纯函数、柯里化函数

    文章内容输出来源:拉勾教育 大前端高薪训练营 前言 学习函数式编程,要知道什么是纯函数,使用纯函数的好处,了解有关副作用的相关信息,以及纯函数相关的功能库Lodash,还有什么是函数的柯里化. 一.纯 ...

  6. html输入支付密码样式,基于JS实现类似支付宝支付密码输入框

    基于JS实现类似支付宝支付密码输入框 2019-01-06 编程之家 https://www.jb51.cc 编程之家收集整理的这篇文章主要介绍了基于JS实现类似支付宝支付密码输入框,编程之家小编觉得 ...

  7. 编程术语_伟大的编程术语烘烤

    编程术语 by Preethi Kasireddy 通过Preethi Kasireddy 伟大的编程术语烘烤 (The Great Programming Jargon Bake-off) Impe ...

  8. 声明式和命令式编程_命令式与声明式编程

    声明式和命令式编程 At this point you've undoubtedly heard about imperative programming vs declarative program ...

  9. 翻译连载 |《你不知道的JS》姊妹篇 |《JavaScript 轻量级函数式编程》- 第 1 章:为什么使用函数式编程?...

    为什么80%的码农都做不了架构师?>>>    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS> ...

最新文章

  1. Python 算术运算符
  2. 【分布式事务】tcc-transaction分布式TCC型事务框架搭建与实战案例(基于Dubbo/Dubbox)...
  3. 雷林鹏分享:PHP 魔术常量
  4. Molecule – 帮助你构建跨平台的 HTML5 游戏
  5. Gradle Sync: Wait for the other thread to finish acquiring the distribution
  6. Java:带符号右移和无符号右移
  7. 今日收到的智商税:远红外
  8. java8 注解: @FunctionalInterface (函数式接口)
  9. RabbitMQ笔记-使用rabbitmq-c让生产者发送数据
  10. UkrGuru.SqlJson——你的SQL Server和.NET 5之间的链接
  11. sublime html文件中php代码,sublime - 嵌套在html里面的php代码该遵循怎样的规范
  12. 当子查询内存在ORDER BY 字句时查询会报错
  13. RoadRunner安装与使用教程
  14. Unity Behavior Designer(行为树)Abort Type(中断类型)
  15. Houdini17 OptiX Denoise使用
  16. 冉宝的每日一题--8月13日
  17. 标准焦距;焦距与景深的关系
  18. JAVA判断直线与线段相交,判断两个线段是否相交
  19. 2DPCA以及增强的双向2DPCA详解
  20. Linux下线程池源码实现

热门文章

  1. 在linux中删除多级目录,如何在Linux中删除目录
  2. iOS-APP崩溃分析
  3. python transpose与permute函数详解
  4. 安装mongodb以及使用Robomongo
  5. 测量汽车LIN总线信号及波形分析-示波器
  6. android 字体粗体_10多种免费的粗体和粗体字体使您的设计更加生动
  7. 深度学习实战13(进阶版)-文本纠错功能,经常写错别字的小伙伴的福星
  8. js文件分片上传,断点续传
  9. 大家眼中的时尚手机什么样?OPPO R9s新年特别版给你答案
  10. Android定位权限判断及开启