2015-09-14 41 views
2

我在读Professor Frisby's Mostly adequate guide to functional programming,我遇到了下面显示的代码示例。我不明白为什么每次调用squareNumber时缓存都不会重置为{}。为什么变量在每次调用函数时都没有被重置

var memoize = function(f){ 
    var cache = {}; // why is this not reset each time squareNumber is called? 

    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); // returns cache for input 4 
//=> 16 
squareNumber(5); 
//=> 25 
squareNumber(5); // returns cache for input 5 
//=> 25 

有一种说法我是因为memoize的是一个全局变量的缓存变量不会被重置每次调用时间。但我似乎无法找到一个好的解决方案。

+1

你为什么认为它*会被重置? 'memoize'返回的函数并不会改变'cache'的值,那么会改变它呢? – Pointy

回答

2

当执行:

var squareNumber = memoize(function(x){ return x*x; }); 

memoize()内部的cache变量被初始化,并于内函数的引用被返回并分配给squareNumber。该内部函数引用了该对象,并且每次在您执行squareNumber(x)时调用该对象,该内部函数继续引用相同的原始变量cache

这实际上是这种设计模式的预期行为,因此缓存可以从一次调用继续存在。

如果你想要一个新的缓存副本,那么你必须再次调用memoize()以重新开始一个新的缓存和新的内部函数,该函数引用了新的cache变量。

仅供参考,因为虽然memoize()已运行并完成了这个被称为闭合,参考到内部功能从执行memoize()回到有这样的局部变量不是垃圾被JS所收集的memoize()局部变量的引用口译员,尽管memoize()早已完成执行。这被称为封闭。

5

因为函数memoize只被调用一次。 memoize(function(x){ return x*x; })只是给出了返回值,这恰好是一个函数。

相关问题