对 Javascript 闭包案例感到困惑

发布于 2024-10-20 19:58:23 字数 990 浏览 2 评论 0原文

我正在使用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”变量超出范围感到困惑。我做错了什么?

I am writing some node.js code using the node-mongodb driver. I decided to cache the collection objects when I obtain them like this:

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

Repeated calls of the usersCollection function should use the cached collection object, except that it doesn't - the cache variable is always undefined. Changing the code to this fixes the problem:

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

I am still confused about why the 'cache' variable goes out of scope. What am I doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

靑春怀旧 2024-10-27 19:58:23

我想你想要这个:

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

而不是你现在拥有的:

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

I think you want this:

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

instead of what you have right now:

function getCollection(collectionName) {
    return function(callback) {
        var cache;
梦断已成空 2024-10-27 19:58:23

getCollection (usersCollection) 返回的函数执行后,cache 上的任何内容都不会关闭。该作用域没有返回任何函数。

cache 需要在 usersCollection 函数之外定义,以便捕获对它的任何引用。

Nothing closes over cache after the function returned from getCollection (usersCollection) executes. There is no function that is returned from that scope.

cache needs to be defined outside of the usersCollection function for any reference to it to be captured.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文