【个人向】20180916 - Read AND Think

2018-09-16 admin

前言

因为想弥补一下自己对一些函数式编程的了解和体会,所以特意找了一些资料来阅读~以下的感想是来自于这本书哒:

《JS 函数式编程指南》 作者: Franklin Risby for his great work! 地址:https://legacy.gitbook.com/bo…

什么是纯函数

纯函数就是保证输入和对应的输出是相同的函数,也就类似于我们课本中学的函数的概念!一个x永远只对应一个y值。

比如,js中存在的会改变原数组的一些数组操作函数,这些就是不纯的。 主要是有共享的变量和成员,比如全局变量之类的。

纯的好处

  • 可缓存性(Cacheable)
  • 可移植性/自文档化(Portable / Self-Documenting)
  • 可测试性(Testable)
  • 合理性(Reasonable)
  • 并行代码

对于可缓存性,有下面这段“通用”的代码,提取一次(即计算)就缓存一次,后面取的时候就不用重新计算了:

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];
  };
};

而如果函数是不纯的话,我们并不能靠输入的值来提取出唯一对应的结果,因为它可能有多种情况。

可移植性

可移植性可以意味着把函数序列化(serializing)并通过 socket 发送。也可以意味着代码能够在 web workers 中运行。总之,可移植性是一个非常强大的特性。

自文档化是说把需要的数据都写在参数里,不写成比如对象的形式,因为对象的属性可以在外面被修改所以可能会造成不一样的结果。 而把参数都列出来,这样使用者也知道它需要什么数据,也就是像有文档一样告诉你。

可测试性 我们很多情况下都是要测试某一个函数或者某一个部分,如果这个函数依赖一些全局的东西,我们在设置断点的时候涵盖的范围就会很大,所以这样会影响我们的测试。而纯函数可以让我们只专注于这一个函数。

断言:表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真,可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言。

合理性

如果一段代码可以替换成它执行所得的结果,而且是在不改变整个程序行为的前提下替换的,那么我们就说这段代码是引用透明的。 我们可以使用一种叫做“等式推导”(equational reasoning)的技术来分析代码。所谓“等式推导”就是“一对一”替换,有点像在不考虑程序性执行的怪异行为(quirks of programmatic evaluation)的情况下,手动执行相关代码。

最后一个并行代码,就是说可以并行运行任意纯函数。因他们不需要访问共享的内存,也不会因副作用而进入竞争状态。

原文链接:https://segmentfault.com/a/1190000016414113

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处。

转载请注明:文章转载自 JavaScript中文网 [https://www.javascriptcn.com]

本文地址:https://www.javascriptcn.com/read-40402.html

文章标题:【个人向】20180916 - Read AND Think

相关文章
javascript实现超炫的向上滑行菜单实例
本文实例讲述了javascript实现超炫的向上滑行菜单。分享给大家供大家参考。具体如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 T...
2017-03-29
关于面向对象编程的一点思考
面向对象编程的对象有两种,第一种是现实世界中的对象在软件中的表示(暗含了类间的一部分关系,如包含等),另一种是为了表示现实世界中对象之间相互作用而虚构起来的类(暗含了类间的另一部分关系,如协作等)。面向对象的思维有两种突出表现形式,第一种是...
2015-12-25
JS基于面向对象实现的放烟花效果
本文实例讲述了JS基于面向对象实现的放烟花效果。分享给大家供大家参考。具体实现方法如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr...
2017-03-23
javascript实现dom动态创建省市纵向列表菜单的方法
本文实例讲述了javascript实现dom动态创建省市纵向列表菜单的方法。分享给大家供大家参考。具体实现方法如下: <!DOCTYPE html PUBLIC "-//W3C//DT...
2017-03-23
用JavaScript实现页面重定向功能的教程
** 页面重定向是什么?** 当你点击一个URL来访问一个网页X,但在内部你被定向到另一页Y,仅仅是因为页面重定向。这一概念是从不同于JavaScript 页面刷新 。 可能有各种原因,为什么想从原来的页面重定向。下面列出的几个原因: 如...
2017-03-24
JavaScript检测鼠标移动方向的方法
本文实例讲述了JavaScript检测鼠标移动方向的方法。分享给大家供大家参考。具体实现方法如下: function Start() { stage.addEventListener(MouseEvent.MOUSE_MOVE, Che...
2017-03-23
JavaScript的jQuery库中ready方法的学习教程
学习 jQuery 有许多途径,我们今天从 jQuery 的 ready 函数开始。本例中的代码都来自于 jQuery 脚本库。 如果你使用过 jQuery , 就必然使用过 ready 函数,它用来注册当页面准备好之后可以执行的函数。 问...
2017-03-29
Javascript实现计算个人所得税
TABLE {     BORDER-RIGHT: medium none; PADDING-RIGHT: 0px; BORDER-TOP: medium none; PADDING-LEFT: 0px; PADDING-BOTTOM: ...
2017-03-23
JavaScript实现向setTimeout执行代码传递参数的方法
本文实例讲述了JavaScript实现向setTimeout执行代码传递参数的方法。分享给大家供大家参考。具体分析如下: setTimeout函数是javascript中实现动态效果最关键的函数。但昨天在写代码的时候发现当第一个参数是函数调...
2017-03-22
使用AngularJS实现表单向导的方法
今天我们将使用AngularJs和伟大的UI Router以及Angular ngAnimate module创建一个带动画的多步表单。这项技术可以用在你想要简化用户操作的大表单上。 我们看到这项技术已经应用在了许多的网页上。比如购物车,注...
2017-03-25
回到顶部