【函数式编程】基于JS 进行函数式编程(一)引入 | 什么是函数式编程 | 纯函数 | 命令式与声明式 | 优点

简介: 【函数式编程】基于JS 进行函数式编程(一)引入 | 什么是函数式编程 | 纯函数 | 命令式与声明式 | 优点

相关文章

【函数式编程】基于JS 进行函数式编程(一)引入 | 什么是函数式编程 | 函数式编程的优点

【函数式编程】基于JS进行函数式编程(二)高阶函数 | 函数代替数据传递 | 函数是一等公民 | 闭包 | 使用高阶函数实现抽象 | 数组的高阶函数

【函数式编程】基于JS进行函数式编程(三)柯里化 | 偏函数 | 组合与管道

【函数式编程】基于JS进行函数式编程(四)函子 | MayBe函子 | Monad函子


什么是函数式编程

引入

概念

我们知道,在数学中,函数可以有如下形式:

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变量作为参数,由此可不依赖外部变量

可缓存

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

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



相关文章
|
10月前
|
机器学习/深度学习 JavaScript 前端开发
JS进阶教程:递归函数原理与篇例解析
通过对这些代码示例的学习,我们已经了解了递归的原理以及递归在JS中的应用方法。递归虽然有着理论升华,但弄清它的核心思想并不难。举个随手可见的例子,火影鸣人做的影分身,你看到的都是同一个鸣人,但他们的行为却能在全局产生影响,这不就是递归吗?雾里看花,透过其间你或许已经深入了递归的魅力之中。
371 19
|
12月前
|
JavaScript
JS实现多条件搜索函数
JS封装的多条件搜索
|
JavaScript 前端开发
JavaWeb JavaScript ③ JS的流程控制和函数
通过本文的详细介绍,您可以深入理解JavaScript的流程控制和函数的使用,进而编写出高效、可维护的代码。
286 32
|
JavaScript 前端开发 Java
详解js柯里化原理及用法,探究柯里化在Redux Selector 的场景模拟、构建复杂的数据流管道、优化深度嵌套函数中的精妙应用
柯里化是一种强大的函数式编程技术,它通过将函数分解为单参数形式,实现了灵活性与可复用性的统一。无论是参数复用、延迟执行,还是函数组合,柯里化都为现代编程提供了极大的便利。 从 Redux 的选择器优化到复杂的数据流处理,再到深度嵌套的函数优化,柯里化在实际开发中展现出了非凡的价值。如果你希望编写更简洁、更优雅的代码,柯里化无疑是一个值得深入学习和实践的工具。从简单的实现到复杂的应用,希望这篇博客能为你揭开柯里化的奥秘,助力你的开发之旅! 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一
|
JavaScript 前端开发 安全
JavaScript函数详解
JavaScript函数的详细解析,包括函数的定义和调用方式(如一般格式、匿名函数、构造函数、自调用函数、箭头函数和严格模式)、函数参数(arguments对象、可变参数、默认参数值)、闭包的概念和应用实例。
JavaScript函数详解
|
前端开发 JavaScript 开发者
除了 Generator 函数,还有哪些 JavaScript 异步编程解决方案?
【10月更文挑战第30天】开发者可以根据具体的项目情况选择合适的方式来处理异步操作,以实现高效、可读和易于维护的代码。
|
JavaScript 前端开发
JavaScript 函数语法
JavaScript 函数是使用 `function` 关键词定义的代码块,可在调用时执行特定任务。函数可以无参或带参,参数用于传递值并在函数内部使用。函数调用可在事件触发时进行,如用户点击按钮。JavaScript 对大小写敏感,函数名和关键词必须严格匹配。示例中展示了如何通过不同参数调用函数以生成不同的输出。
|
存储 JavaScript 前端开发
JS函数提升 变量提升
【10月更文挑战第6天】函数提升和变量提升是 JavaScript 语言的重要特性,但它们也可能带来一些困惑和潜在的问题。通过深入理解和掌握它们的原理和表现,开发者可以更好地编写和维护 JavaScript 代码,避免因不了解这些机制而导致的错误和不一致。同时,不断提高对执行上下文等相关概念的认识,将有助于提升对 JavaScript 语言的整体理解和运用能力。
|
JavaScript 前端开发 Java
【javaScript数组,函数】的基础知识点
【javaScript数组,函数】的基础知识点
160 5
|
JavaScript 前端开发
js教程——函数
js教程——函数
356 4

热门文章

最新文章