纯函数:
- 相同的输入 === 相同的输出:
- 每一个输入值返回且只返回一个输出值:一对一 || 多对一
- 没有副作用:跟函数外部环境发生的交互就都是副作用
- 发送一个 http 请求
- 打印/log
- 获取用户输入
- DOM 查询
- 等等...
// 不纯的
var minimum = 21;
var checkAge = function(age) {
return age >= minimum;
};
// 纯的
var checkAge = function(age) {
var minimum = 21;
return age >= minimum;
};
- 可缓存
- 可移植性
- 可测试性
- 合理性
- 并行代码
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];
};
};
var pure = memoize(function(num){
return num
})
pure(1) // 1
pure(1) // 1
不依赖于环境,在不同的环境也能使用,具有可移植性
// 不纯的
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, ...);
...
};
// 纯的
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) {
...
};
纯函数让测试更加容易
由于是纯函数,可以使用引用透明性来替换等式 引用透明性:在不改变整个程序行为的前提,一段代码可以替换成它执行所得的结果
var print = function(name) {
console.log(name)
}
var getName = function(print, name) {
return print(name)
}
getName(print, 'sihai')
// 引用透明替换等式
// 1. getName中参数代入
print('sihai')
// 2. 执行print代码
console.log('sihai')
可以并行运行任意纯函数。因为纯函数根本不需要访问共享的内存,而且根据其定义,纯函数也不会因副作用而进入竞争态 并行代码在服务端 js 环境以及使用了 web worker 的浏览器那里是非常容易实现的