困惑于一个Javascriptclosures的情况

我正在使用node-mongodb驱动程序编写一些node.js代码。 我决定caching集合对象,当我得到他们这样的:

var db = connectionObject; function getCollection(collectionName) { return function(callback) { var cache; if (cache) return callback(null, cache); db.collection(collectionName, function(err, collection) { return err ? callback(err) : callback(null, cache = collection); }); } } var usersCollection = getCollection('users'); usersCollection(function(err, collection) { collection.find({}); // Rest of code here ... }); 

usersCollection函数的重复调用应该使用caching的集合对象,不同之处在于cachingvariables总是未定义的。 更改代码来解决这个问题:

 return function(callback) { var cache = arguments.callee; if (cache.cached) return callback(null, cache.cached); db.collection(collectionName, function(err, collection) { return err ? callback(err) : callback(null, cache.cached = collection); }); } 

我仍然为什么“caching”variables超出范围感到困惑。 我究竟做错了什么?

我想你想要这个:

 function getCollection(collectionName) { var cache; return function(callback) { 

而不是你现在所拥有的:

 function getCollection(collectionName) { return function(callback) { var cache; 

getCollectionusersCollection )返回的函数执行后,没有任何东西closurescache 。 没有从该范围返回的函数。

cache需要在usersCollection函数之外定义,以便对其进行捕获。