纯函数的定义,非常重要!!

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)的更多相关文章

  1. 什么叫pure function(纯函数)

    (来自:http://en.wikipedia.org/wiki/Pure_function) 在计算机编程中,假如满足下面这两个句子的约束,一个函数可能被描述为一个纯函数: 给出同样的参数值,该函数 ...

  2. 闭包(Closure)和匿名函数(Anonymous function)/lambda表达式的区别

    闭包(Closure)和匿名函数(Anonymous function)/lambda表达式的区别 函数最常见的形式是具名函数(named function): function foo(){ con ...

  3. 动手实现 Redux(三):纯函数(Pure Function)简介

    我们接下来会继续优化我们的 createStore 的模式,让它使我们的应用程序获得更好的性能. 但在开始之前,我们先用一节的课程来介绍一下一个函数式编程里面非常重要的概念 —— 纯函数(Pure F ...

  4. 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 ...

  5. Function Programming - 柯里化(curry)

    看到一篇非常不错的文章,这里分享给大家:http://www.jianshu.com/p/fa3568087881. 首先,柯里化的定义:你可以只透过部分的参数呼叫一个function,它会回传一个f ...

  6. 【repost】js中(function(){…})()立即执行函数写法理解

    摘要: javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花,当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解. ...

  7. jQuery源码笔记(二):定义了一些变量和函数 jQuery = function(){}

    笔记(二)也分为三部分: 一. 介绍: 注释说明:v2.0.3版本.Sizzle选择器.MIT软件许可注释中的#的信息索引.查询地址(英文版)匿名函数自执行:window参数及undefined参数意 ...

  8. 【转】PowerShell 函数(Function)

    转至:http://blog.csdn.net/kk185800961/article/details/49022395 函数基本操作: [plain] view plain copy #创建函数 F ...

  9. js中(function(){…})()立即执行函数写法理解

    文章摘自https://my.oschina.net/u/2331760/blog/468672?p={{currentPage+1}} 摘要: javascript和其他编程语言相比比较随意,所以j ...

随机推荐

  1. Spring4.0.1+Quartz2.2.1实现定时任务调度[亲测可用]

    Spring4.0.1+Quartz2.2.1实现定时任务调度[亲测可用] tip:只需要配置xml文件即可 1.第三方依赖包的引入 <properties> <project.bu ...

  2. C#编译器和CLI的安装

    为了完成C#程序编译和运行,需要安装代码对应版本的编译器和CLI(公共语言框架)平台. (部分内容摘自<C#本质论>) 针对主流的CLI平台(Microsoft .NET),有两种安装方案 ...

  3. 使用 Prometheus + Grafana 对 Kubernetes 进行性能监控的实践

    1 什么是 Kubernetes? Kubernetes 是 Google 开源的容器集群管理系统,其管理操作包括部署,调度和节点集群间扩展等. 如下图所示为目前 Kubernetes 的架构图,由 ...

  4. LVS原理讲解

    一.lvs介绍 LVS的英文全名为"Linux Virtual Server",即Linux虚拟服务器,是一个虚拟的四层交换器集群系统,根据目标地址和目标端口实现用户请求转发,本身 ...

  5. python识别html主要文本框

    在抓取网页的时候只想抓取主要的文本框,例如 csdn 中的主要文本框为下图红色框: 抓取的思想是,利用bs4查找所有的div,用正则筛选出每个div里面的中文,找到中文字数最多的div就是属于正文的d ...

  6. java 入门之八大内置基本类型

    本文采用eclipse 工具演示,如果您对eclipse 工具不了解,请先学习下 eclipse 工具的使用,这个里面只是简单的介绍下输出和注释: 安装完成eclipse 以后,双击进入 后一次点击 ...

  7. java笔记02

    一,编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数 /** * */ package 课堂2; import java.util.Random; /** * @author 信16 ...

  8. LeetCode 53. Maximum Subarray(最大的子数组)

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  9. MySql中利用insert into select 准备数据uuid主键冲突

    MYSQL 中表1需要准备大量数据,内容主要取自表2,id必须为32位uuid (项目所有表都是这样,没办法), 准备这样插入: INSERT INTO TBL_ONE (ID, SOID, SNAM ...

  10. 仿微信抢红包(js 转)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...