Function Programming - 纯函数(Pure Function)
纯函数的定义,非常重要!!
Pure function 意指相同的输入,永远会得到相同的输出,而且没有任何显著的副作用。
老样子,我们还是从最简单的栗子开始:
var minimum = 21;
var OutercompareNumber = function(number) {
return number > minimum;
} 以及 var InnercompareNumber = function(number) {
var minimum = 21;
return number > minimum;
}
以上两个函数的区别大家都看到了,一个minimum定义在函数外面,一个在函数里面;那么我们调用这两个函数的结果就很有可能是不一样的;比如,我们在调用OutercompareNumber的时候,假设number这个参数我们始终传20,minimum不改变的情况下,结果为false;但一旦minimum改变成19,结果就为true,OutercompareNumber就不是pure的函数;而InnercompareNumber这个函数,如果始终传20,结果始终为false,那么我们就说InnercompareNumber为纯函数(pure function)。
总结来说,就是传的参数相同的情况下,永远会得到相同的输出。
那么我们说的显著的副作用又是什么呢?我们来看下定义:副作用是在计算结果的过程中,系统状态的一种改变,或是外部世界可观察的交互作用。
比如,更改档案系统,发送http请求等,只要与function外部环境发生交互作用的都是副作用。
那么,如何避免这些副作用呢,继续来看栗子:
var callRequest = function(url, params) {
return $.getJSON(url, params);
}
与
var delayCallRequest = function(url, params) {
return function() {
return $.getJSON(url, params);
}
}
callRequest直接返回了一个http请求,那么这个是与外界交互,返回的结果有太大的不确定性,所以是impure的函数;而delayCallRequest采用了延迟执行的方式,返回了一个函数,只有调用这个函数的时候才会发送请求:delayCallRequest(url, params)(),但就delayCallRequest而言,传相同的参数,得到的结果是一样的,是相同参数的函数,所以这个是一个pure的函数。
再看一个栗子,我们深入理解一下:
//impure
var signUp = function(attrs) {
var user = saveUser(attrs);
welcomeUser(user);
}; var saveUser = function(attrs) {
var user = Db.save(attrs);
...
}; var welcomeUser = function(user) {
Email(user, ...);
...
}; //pure
var signUp = function(Db, Email, attrs) {
return function() {
var user = saveUser(Db, attrs);
welcomeUser(Email, user);
};
}; var saveUser = function(Db, attrs) {
...
}; var welcomeUser = function(Email, user) {
...
};
pure函数会自给自足,函数的依赖会特别明确,像impure的函数,Email做了什么我们并不知道,Db在背后做了什么,我们也无所得知,所以他们以参数的形式,保证输入相同的情况下,得到的结果一定是相同的,注意,这里也用了延迟执行的方式。
好啦,今天的纯函数就介绍到这里,我们下回再见~~早安!
Function Programming - 纯函数(Pure Function)的更多相关文章
- 什么叫pure function(纯函数)
(来自:http://en.wikipedia.org/wiki/Pure_function) 在计算机编程中,假如满足下面这两个句子的约束,一个函数可能被描述为一个纯函数: 给出同样的参数值,该函数 ...
- 闭包(Closure)和匿名函数(Anonymous function)/lambda表达式的区别
闭包(Closure)和匿名函数(Anonymous function)/lambda表达式的区别 函数最常见的形式是具名函数(named function): function foo(){ con ...
- 动手实现 Redux(三):纯函数(Pure Function)简介
我们接下来会继续优化我们的 createStore 的模式,让它使我们的应用程序获得更好的性能. 但在开始之前,我们先用一节的课程来介绍一下一个函数式编程里面非常重要的概念 —— 纯函数(Pure F ...
- react事件绑定的三种常见方式以及解决Cannot update during an existing state transition (such as within `render`). Render methods should be a pure function of props and state问题思路
在 React 组件中,每个方法的上下文都会指向该组件的实例,即自动绑定 this 为当前组件. 而且 React 还会对这种引用进行缓存,以达到 CPU 和内存的优化.在使用 ES6 classes ...
- Function Programming - 柯里化(curry)
看到一篇非常不错的文章,这里分享给大家:http://www.jianshu.com/p/fa3568087881. 首先,柯里化的定义:你可以只透过部分的参数呼叫一个function,它会回传一个f ...
- 【repost】js中(function(){…})()立即执行函数写法理解
摘要: javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解. ...
- jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}
笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...
- 【转】PowerShell 函数(Function)
转至:http://blog.csdn.net/kk185800961/article/details/49022395 函数基本操作: [plain] view plain copy #创建函数 F ...
- js中(function(){…})()立即执行函数写法理解
文章摘自https://my.oschina.net/u/2331760/blog/468672?p={{currentPage+1}} 摘要: javascript和其他编程语言相比比较随意,所以j ...
随机推荐
- Bootstrap 禁用滚动条
Bootstrap中禁用滚动条的方法 逻辑: 当点击弹窗按钮后,js会为body元素添加一个modal-open的类,该类主要内容如下 .modal-open .modal { overflow-x: ...
- Ubuntu15.04 网站服务器环境搭建,php/html/css等学习环境搭建教程
---恢复内容开始--- 本文部分参考自:http://www.cnblogs.com/emouse/archive/2013/06/07/3124009.html 原文中存在少量错误,已改正. 首先 ...
- Nand Flash基础知识与坏块管理机制的研究
概述 Flash名称的由来,Flash的擦除操作是以block块为单位的,与此相对应的是其他很多存储设备,是以bit位为最小读取/写入的单位,Flash是一次性地擦除整个块:在发送一个擦除命令后,一次 ...
- [mysql使用(3)] 使用mysql的时候遇到的一些错误
1.Err1055,出现这个问题往往是在执行sql语句时候,在最后一行会出现这个问题. [Err] 1055 - Expression #1 of ORDER BY clause is not in ...
- Java随机数和UUID
Java随机数和UUID Java随机数 在Java项目中通常是通过Math.random方法和Random类来获得随机数,前者通过生成一个Random类的实例来实现. 此类产生的是一组伪随机数流,通 ...
- onclick事件触发 input type=“file” 上传文件
添加按钮: <input type="button" name="button" value="浏览" onclick="j ...
- iOS之 git 简单使用
之前没有用过git管理代码, 现在 公司要求使用git,咱 就 记记 今天所学的东西.以后也好方便查阅 和补充. 首先 我描述一下我今天提交代码的情况. 同伴给了我一个 从git库下来的2个项目的包. ...
- django-rest-framework之序列化
前言:昨天学习了rest-framework序列化方面的知识,故写了博客记录一下.官网:http://www.django-rest-framework.org/tutorial/1-serializ ...
- git常用命令集合
git命令 git init:创建一个仓库并在目录下新建一个.git的文件(初始化一个git仓库) 注:.git文件在工作区,是一个隐藏文件(用ls -ah命令查看),但是它不算工作区,而是git 的 ...
- Leetcode题解(十六)
44 ----------------------------------------------------------------分割线------------------------------ ...