JavaScript Functional Programming:纯函数
来源:互联网 发布:四川省住建厅数据共享 编辑:程序博客网 时间:2024/05/21 14:06
函数式编程鼓励我们多创建纯函数(pure functions),纯函数只依赖你交给它的东西,不使用任何函数以外的东西,也不会影响到函数以外的东西。跟纯函数对应的就是不纯函数(impure functions),也就是不纯函数可能会使用函数以外的东西,比如使用了一个全局变量。也可能会影响到函数以外的东西,比如改变了一个全局变量的值。
多使用纯属函数是因为它更可靠一些,也没什么副作用(side effects)。你交给它同样的值,它每次都会给你输出同样的结果,这种特质叫所指透明(Referential transparency) 。这会让程序更稳定,也更容易测试。
副作用
纯函数没副作用,有副作用的函数都不纯。我吃了一片感冒药,是要治我的感冒,但副作用是它让我想睡觉。函数的副作用多数表现为函数依赖或者改变了它以外的东西。
看个例子:
let name = 'longzhoufeng'const greet = () => { console.log(`hello, ${name}`)}
greet 不是纯函数,因为这个函数依赖函数以外的东西,这里就是全局作用域下的 name。这样做的问题是,函数依赖的 name 很可能在应用运行的时候发生变化,这样试一下:
greet() // 输出:“hello, longzhoufeng”let name = 'longzhoupeng' // name 的值被改变了greet() // 输出:“hello, longzhoupeng”
这样改一下:
const greet = (name) => { console.log(`hello, ${name}`)}
现在函数明确的说明了自己需要的东西,这里就是 name 参数。它现在只依赖你交给它的 name 参数的值。但是这个函数仍然不是纯函数,因为它在控制台上输出了东西,这其实改变了函数之外的东西,所以它不是纯函数。这样再改一下:
const greet = (name) => { return `hello, ${name}`}
现在 greet 就会是一个纯函数,因为它只依赖交给它的 name ,也没有改变函数以外的东西。而且你每次给它同样的 name 值,它每次都会给我们返回同样的结果。这种函数用起来即安全又可靠。
所指透明
所指透明(Referential transparency)。比如我说:“中国的首都”。我的表达所指的意思就是 “北京”,没什么其它的隐含的意思。所以可以说我的表达所指是透明的(Referentially transparent)。再比如:“我有点饿”。这个表达所指就不透明,我表达的到底是什么意思是不能确定的,我可能是想出去吃点东西,也可能是想让你帮我买点东西回来吃。
纯函数所指的东西都是透明的,因为你给它同样的东西,它每次都会返回一样的结果。
const greet = (name) => { return `hello, ${name}`}const logger = (message) => { console.log(message)}logger(greet('longzhoufeng'))// 上面的表达式也可以这样:logger('hello, longzhoufeng')// 得到的结果是一样的,因为 greet 所指透明。// 给它一个 “longzhoufeng”,它所指的东西就是 “hello, longzhoufeng”
因为 greet 所指透明,所以如果我们在表达式中把它替换成它所指的东西,不会影响到程序的运行。比如在一个表达式里所有使用 greet(‘longzhoufeng’) 的地方,我们都可以把 greet(‘longzhoufeng’) 替换成 hello, longzhoufeng,这是因为 greet(‘longzhoufeng’) 所指的东西就是字符串 hello, longzhoufeng 。
参考资料
http://stackoverflow.com/questions/210835/what-is-referential-transparency
- JavaScript Functional Programming:纯函数
- JavaScript Functional Programming:箭头函数 Arrow functions
- JavaScript Functional Programming:组合函数 Composition
- 函数编程(Functional programming)
- JavaScript Functional Programming:高阶函数 Higher order functions
- Functional Programming函数式编程
- 函数式编程Functional Programming
- 函数式编程(Functional Programming)
- 面向函数范式编程(Functional programming)
- 函数式编程(functional programming)学习总结
- python函数式编程(Functional Programming)
- 面向函数范式编程(Functional programming)
- functional programming
- Functional Programming
- Functional Programming
- JavaScript Functional Programming:声明式与命令式
- 编程思想基本概念之函数式编程(Functional Programming)
- 关于函数式编程(Functional Programming)的学习笔记Ⅰ
- Spring的版本和JDK版本要求
- dubbo 并发控制 和 连接控制
- html5 获取摄像头和麦克风的案例
- excel前台导出json
- 机器学习的统计学概念
- JavaScript Functional Programming:纯函数
- MySQL 数据库操作
- 特征编码
- C语言实现通讯录—动态顺序表
- python保存log日志,并利用log日志来画图
- javascript类的创建与实例对象
- javaweb后端实例 service
- ngx_http_realip_module使用详解
- Delphi-日期时间函数