使用闭包缓存函数的生成

通过闭包, 我们可以缓存函数的生成, 这是函数式编程的核心内容之一, 也是纯函数的应用

先看一个简单的示例:

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 squareNumber  = memoize(function(x){ return x*x; });
squareNumber(4);
//=> 16
squareNumber(4); // 从缓存中读取输入值为 4 的结果
//=> 16
squareNumber(5);
//=> 25
squareNumber(5); // 从缓存中读取输入值为 5 的结果
//=> 25

甚至可以通过闭包缓存不存的函数, 使其变为纯函数

var pureHttpCall = memoize(function(url, params){
  return function() { return $.getJSON(url, params); }
});

注意, 我们并没有真正发送 http 请求——只是返回了一个函数,当调用它的时候才会发请求。这个函数之所以有资格成为纯函数,是因为它总是会根据相同的输入返回相同的输出:给定了 url 和 params 之后,它就只会返回同一个发送 http 请求的函数。

我们的 memoize 函数工作起来没有任何问题,虽然它缓存的并不是 http 请求所返回的结果,而是生成的函数。重点是我们可以缓存任意一个函数,不管它们看起来多么具有破坏性。

参考: 纯函数的好处: 追求“纯”的理由

MIT Licensed | Copyright © 2018-present 滇ICP备16006294号

Design by Quanzaiyu | Power by VuePress