困惑于一个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;
从getCollection
( usersCollection
)返回的函数执行后,没有任何东西closurescache
。 没有从该范围返回的函数。
cache
需要在usersCollection
函数之外定义,以便对其进行捕获。