Skip to content

Latest commit

 

History

History
120 lines (98 loc) · 2.45 KB

第3章:纯函数的好处.md

File metadata and controls

120 lines (98 loc) · 2.45 KB

第3章:纯函数的好处

纯函数:

  • 相同的输入 === 相同的输出:
  • 每一个输入值返回且只返回一个输出值:一对一 || 多对一
  • 没有副作用:跟函数外部环境发生的交互就都是副作用
    • 发送一个 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 的浏览器那里是非常容易实现的

参考