对Javascript闭包案件感到困惑

时间:2011-03-09 16:37:15

标签: javascript mongodb node.js closures

我正在使用node-mongodb驱动程序编写一些node.js代码。当我像这样获取它们时,我决定缓存集合对象:

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函数的重复调用应使用缓存的集合对象,但它不会 - 缓存变量始终未定义。将代码更改为此可以解决问题:

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);
    });
}

我仍然对'cache'变量超出范围的原因感到困惑。我做错了什么?

2 个答案:

答案 0 :(得分:5)

我想你想要这个:

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

而不是你现在所拥有的:

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

答案 1 :(得分:1)

cachegetCollection)返回的函数执行后,usersCollection没有关闭。没有从该范围返回的函数。

cache需要在usersCollection函数之外定义,以便对其进行任何引用。