节省开销——使用缓存代理进行计算

76 阅读1分钟

缓存代理让计算函数本身专注于自己的计算,而让代理对象实现缓存的功能。

<script>
      var mult = function() {
            var a = 1;
            for(var i = 0, len = arguments.length; i < len; i++) {
                a = a * arguments[i]
            }
            return a
      }

      var proxyMult = (function() {
          var cache = {}
        return function() {
            var key = Array.prototype.join.call(arguments, ',')
            if (key in cache) {
                return cache[key]
            }
            return cache[key] = mult.apply(this, arguments)
        }
      })()
      console.log(mult(1,2,3,4))
      console.log(mult(1,2,3,4))
      console.log(proxyMult(1,2,3,4, 5))
      console.log(proxyMult(1,2,3,4, 5))
   </script>

进一步扩展,如果有个加法运算,也需要进行缓存代理,则需要一个创建缓存代理的工厂。

     var mult = function() {
            var a = 1;
            for(var i = 0, len = arguments.length; i < len; i++) {
                a = a * arguments[i]
            }
            return a
      }
      
      
    var plus = function() {
        var a = 0;
            for(var i = 0, len = arguments.length; i < len; i++) {
                a = a + arguments[i]
            }
            return a
      }
      
     var createProxyFactory = function(fn) {
        var cache = {}
        return function() {
            var key = Array.prototype.join.call(arguments, ',')
            if (key in cache) {
                return cache[key]
            }
            return cache[key] = fn.apply(this, arguments)
        }
      }
      
      var proxyMult = createProxyFactory(mult)
      var proxyPlus = createProxyFactory(plus)
      console.log(proxyMult(1,2,3,4))
      console.log(proxyMult(1,2,3,4))
      console.log(proxyPlus(1,2,3,4))
      console.log(proxyPlus(1,2,3,4))