JavaScript函数式编程之副作用
更多相关内容见博客 github.com/zhuanyongxi…
概念:
副作用是在计算结果的过程中,系统状态的一种变化,或者与外部世界进行的可观察的交互。
上文中的纯函数的概念很严格,这个副作用的概念也是。它的要求很高,概括的讲,只要是跟函数外部环境发生的交互就都是副作用。从“副作用”这个词语来看,它更多的情况在于“改变系统状态”。
在教程中列举的一些副作用:
- 更改文件系统
- 往数据库插入记录
- 发送一个http请求
- 可变数据
- 打印/log
- 获取用户输入
- DOM查询
- 访问系统状态
如果完全没有副作用,那我们的代码就是单纯的跑一遍浪费了一点电而已,除此之外什么都没有发生,这样的话我们写代码就没有意义了。所以,在JS中,我们的目的不是完全消除副作用注1,而是避免那些不应该出现的副作用。
JS原生的方法中,map
就很函数式,他会返回一个新的数组,不会改变原数组。而pop
这种方法就很不好,它在操作了数组之后,也改变数组本身。
所以当我们要使用那些有副作用的方法写纯函数的时候,记得做一次深拷贝:
例1
const myPop = x => { let [...y] = x; return y.pop(); }
使用一个固定的共享状态或者调用一个纯函数不算是副作用,例子如下:
例2
const a = 5; function A(b) { return a + b; } A(5);
调用纯函数的例子:
例3
function foo(x) { return bar(x); } function bar(y) { return y + 1; } foo(1);
虽然不算是副作用,可更加推荐的方式是把函数bar用参数的方式传进来,这样就做到了解耦,用起来更加的方便:
例4
function foo(fn, x) { return fn(x); } function bar(y) { return y + 1; } foo(bar, 1);
如果使用柯里化的方式,会更加的清爽和方便:
例5
function foo(fn) { return function(x) { return fn(x); } } function bar(y) { return y + 1; } foo(bar)(1);
这个例子依然存在一个会令我们感到不安的地方,那就是bar可能会被修改。例如:
例6
function foo(fn, x) { return fn(x); } function bar(y) { return y + 1; } bar = undefined; foo(bar, 1);
当然我们平时很少会大脑抽筋在全局作用域下写出一个bar = undefined
来让我们的系统出错,这更可能在某个有副作用的函数内出现这种情况。这就是为什么我们要避免副作用。这个情况在ES6中会得到改善,例如:
例7
const foo = function(fn, x) { return fn(x); } const bar = function(y) { return y + 1; } bar = undefined; // error foo(bar, 1);
个人建议用const
的方式,这样更加的安全,即便出错也可以快速定位。
注释:
- 注1: 如果继续深入学习,对与上面列出的一些副作用,函数式还有一种延迟执行的方式(IO容器)来使这些操作变纯。
参考资料:

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
【转】Java面试题全集(上)
准备从C#转java,在找工作之前准备看看面试题,有幸看到大神的作品,mark一下,以后慢慢看。。。 2013年年底的时候,我看到了网上流传的一个叫做《Java面试题大全》的东西,认真的阅读了以后发现里面的很多题目是重复且没有价值的题目,还有不少的参考答案也是错误的,于是我花了半个月时间对这个所谓的《Java面试大全》进行了全面的修订并重新发布在我的CSDN博客。在修订的过程中,参照了当时JDK最新版本(Java 7)给出了题目的答案和相关代码,去掉了EJB 2.x、JSF等无用内容或过时内容,补充了数据结构和算法、大型网站技术架构、设计模式、UML、Spring MVC等内容并对很多知识点进行了深入的剖析,例如hashCode方法的设计、垃圾收集、并发编程、数据库事务等。当时我甚至希望把面试中经常出现的操作系统、数据库、软件测试等内容也补充进去,但是由于各种原因,最终只整理出了150道面试题。让我欣慰的是,这150道题还是帮助到了很多人,而且在我CSDN博客上的总访问量超过了5万次,最终还被很多网站和个人以原创的方式转载了。最近一年内,用百度搜索"Java面试"我写的这些东西基本上...
- 下一篇
【总】java面试题
100+经典Java面试题及答案解析 https://www.cnblogs.com/pureEve/p/6546280.html 2017 最新java面试题(技术面试) https://blog.csdn.net/zhangcc233/article/details/77847104 Java面试题集(1-50) https://blog.csdn.net/jackfrued/article/details/17339393 Java面试2018常考题目汇总(一) https://blog.csdn.net/hope900/article/details/78647466 Java面试题全集(上) https://blog.csdn.net/jackfrued/article/details/44921941#comments Java面试题全集(中) https://blog.csdn.net/jackfrued/article/details/44931137 Java面试题全集(下) https://blog.csdn.net/jackfrued/article/...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Hadoop3单机部署,实现最简伪集群
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Windows10,CentOS7,CentOS8安装Nodejs环境