欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

js函数式编程(1)-纯函数

程序员文章站 2023-11-07 19:04:22
我将写的第一个主题是 js的函数式编程 ,这一系列都是 mostly adequate guide 这本书的读书总结。原书在gitbook上,有中文版。由于原作者性格活泼,书中夹杂很多俚语,并且行文洒脱。中文译版难免有时需要思量一番,既然读了就写出来,能方便别人最好,也请读者指正。正文如下。 如果一 ......
##### 我将写的第一个主题是**js的函数式编程**,这一系列都是*mostly adequate guide*这本书的读书总结。原书在gitbook上,有中文版。由于原作者性格活泼,书中夹杂很多俚语,并且行文洒脱。中文译版难免有时需要思量一番,既然读了就写出来,能方便别人最好,也请读者指正。正文如下。 ---- ### 如果一个函数是纯函数,那么其不依赖外部环境,并且不产生副作用。 - 1.不依赖外部环境,反例如下: ```javascript const a1 = 10; const afunc1 = () => { // 依赖外部变量 return a1; } ``` 依赖外部环境的函数在运行时必须满足环境条件,如上,afunc1在a1创建之前运行,就出错了。 - 2.不产生副作用。所谓副作用,是一切与外部交互的作用,比如console.log,io,网络请求等。这些操作的结果是不可预计的,所以当包含副作用操作的函数执行后,结果是不可预计的。比如io读写失败,网络出现问题,console.log通常没什么问题,但这仍然是外部的。举个片面的例子,在react里使用,就有可能因为打印某个在未来会被改变的状态,导致组件不必要的被刷新。 - 3.函数与外部的合法交互只能通过参数传递的方式。 ### 那么为什么要用纯函数,纯函数和函数式编程有什么关系?

函数式编程,本质上是数学,它是数学现有理论在编程上的实现,在数学上,一个定理成立通常要满足一些数学条件,函数式编程也需要满足条件,这个条件就是函数必须是纯函数。

### 那么这是什么数学理论呢?
js函数式编程(1)-纯函数

如上图,可以用一个函数表达式描述,即y = f(x),这是一种一一对应关系,输入x能得到唯一的结果y。也就是说x经过f的转换变成y,这个过程是稳定的,确定的,以此类推,y也可以经过某种确定的转换g,变成z,那么就具有如下等式:

$$y = f(x) = 2x$$ $$z = g(y) = y + 1$$ $$z = g(f(x)) = w(x) = 2x + 1$$

也就是说x经过w转换,可以变成z

js函数式编程(1)-纯函数

某个状态经过多个函数转换成另一个状态,那么中间转换过程可以结合成一个转换,这大大的使问题简化,这是函数式编程带来的好处,而且只是一部分的好处,而这都基于纯函数。

### 如何看待副作用?

当然,我们知道,**很多时候无法避免使用副作用**。就如发送消息,必须经过网络。那是否函数式编程没有实际运用价值呢?当然不是。所有事情都不应该极端的理解,函数式编程的种种定理必须以纯函数作为根基,目的是写出健壮的,声明式的代码。可以利用函数式编程中如curry,functor,monad等奇巧淫记,将副作用加以限制并降到最低限度,保证代码的大部分是纯的。