前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >JavaScript: 函数式编程-什么是纯函数

JavaScript: 函数式编程-什么是纯函数

作者头像
西南_张家辉
发布2021-02-02 10:13:37
发布2021-02-02 10:13:37
63400
代码可运行
举报
文章被收录于专栏:张家辉的树屋张家辉的树屋
运行总次数:0
代码可运行

了解 JavaScript 函数式编程目录

编码原则

  • DRY(不要重复自己,don't repeat yourself)
  • 高内聚低耦合(loose coupling high cohesion)
  • YAGNI (你不会用到它的,ya ain't gonna need it)
  • 最小意外原则(Principle of least surprise)
  • 单一责任(single responsibility)等等。

看一个纯函数的例子

  • 纯函数不改变原始的输入值。避免无用的副作用
代码语言:javascript
代码运行次数:0
复制
var xs = [1,2,3,4,5];

// 纯的
xs.slice(0,3);
//=> [1,2,3]

xs.slice(0,3);
//=> [1,2,3]

xs.slice(0,3);
//=> [1,2,3]


// 不纯的
xs.splice(0,3);
//=> [1,2,3]

xs.splice(0,3);
//=> [4,5]

xs.splice(0,3);
//=> []

silce 就是一个纯函数,没有改变初始的值。而我们常用的 splice 就是一个影响初始值的不纯的函数。

副作用

副作用可能包括以下,但不限于:

代码语言:javascript
代码运行次数:0
复制
更改文件系统
往数据库插入记录
发送一个 http 请求
可变数据
打印/log
获取用户输入
DOM 查询
访问系统状态

我们可以概括来看,只要和外部环境发生一定交互的都是副作用。我们在书写纯函数的时候尽量要保持无副作用的交互。

当然并不是要禁止一切的副作用,而是说我们需要在可控的范围内去发生。

追求纯函数

我们在初中开始学习函数的时候知道:函数是不同数值之间的特殊关系:每一个输入值返回且只返回一个输出值

  • 我们要保持这种逻辑,让函数得到一个确认的值。

可缓存性(Cacheable)

下面来实现一个缓存的函数

代码语言:javascript
代码运行次数:0
复制
var squareNumber  = memoize(function(x){ return x*x; });

squareNumber(4);
//=> 16

squareNumber(4); // 从缓存中读取输入值为 4 的结果
//=> 16

squareNumber(5);
//=> 25

squareNumber(5); // 从缓存中读取输入值为 5 的结果
//=> 25
复制代码

这里看看 memoize 缓存函数是怎么实现的

代码语言:javascript
代码运行次数:0
复制
var memoize = function(f) {
  var cache = {};

  return function() {
    var arg_str = JSON.stringify(arguments);
    cache[arg_str] = cache[arg_str] || f.apply(f, arguments);
    return cache[arg_str];
  };
};
复制代码

下面会看到这种缓存函数的实用性

可移植性/自文档化

纯函数是完全自给自足的,它需要的所有东西都能轻易获得。仔细思考思考这一点...这种自给自足的好处是什么呢?首先,纯函数的依赖很明确,因此更易于观察和理解

并行代码

最后一点,也是决定性的一点:我们可以并行运行任意纯函数。因为纯函数根本不需要访问共享的内存,而且根据其定义,纯函数也不会因副作用而进入竞争态(race condition)。

并行代码在服务端 js 环境以及使用了 web worker 的浏览器那里是非常容易实现的,因为它们使用了线程(thread)。不过出于对非纯函数复杂度的考虑,当前主流观点还是避免使用这种并行。

总结

运用以上的规则,来合理的使用纯函数式的编程,这样我们的代码会更加的优雅。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 编码原则
  • 看一个纯函数的例子
  • 副作用
  • 追求纯函数
    • 可缓存性(Cacheable)
    • 可移植性/自文档化
  • 并行代码
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档