使用nodejs中的模块的可变范围

时间:2012-02-17 04:19:27

标签: javascript node.js

很抱歉,如果这是一个基本问题。我已经找到了有关创建模块的信息,但在使用模块时没有发现有关变量范围的信息。

当我最初编写程序时,它是作为单个文档编写的

var mongodb = require('mongodb');
var server = new mongodb.Server("192.168.199.10", 27017, {});

new mongodb.Db('syslog', server, {}).open(function (error, client) {
    if (error) throw error;
    var collection = new mongodb.Collection(client, 'messages');


    collection.distinct("JUNOS.SRC.IP", function(err, results) {
        var sessionCounts = [];

        function parseSessionCounts(hosts, callback) {
            var loop = 1,
                numLoop = hosts.length;

            hosts.forEach(function(element){
                collection.find({"JUNOS.SRC.IP": element, "JUNOS.ACTION":'closed'}).count(function(err,count){
                    if (loop++ < numLoop){
                        sessionCounts.push({host:element,count:count});
                    } else {
                        sessionCounts.push({host:element,count:count});
                        callback();
                    }
                })
            });
        }

        parseSessionCounts(results, function() {
            console.log(sessionCounts);
            client.close();
        });
    })
});

为了使我的代码可以重用,我将parseSessionCount函数分解为一个模块:

sessionCount.js

var sessionjs = require('./session'),
    mongodb = require('mongodb'),
    server = new mongodb.Server("192.168.199.10", 27017, {});

new mongodb.Db('syslog', server, {}).open(function (error, client) {
    if (error) throw error;
    var collection = new mongodb.Collection(client, 'messages');


    collection.distinct("JUNOS.SRC.IP", function(err, results) {
        var sessionCounts = [];


        sessionjs.parseSessionCounts(results, collection, sessionCounts, function() {
            console.log(sessionCounts);
            client.close();
        });
    })
});

和session.js

module.exports = {

        parseSessionCounts: function (hosts, collection, sessionCounts, callback) {
            var loop = 1,
            numLoop = hosts.length;

            hosts.forEach(function(element){
                collection.find({"JUNOS.SRC.IP": element, "JUNOS.ACTION":'closed'}).count(function(err,count){
                    if (loop++ < numLoop){
                        sessionCounts.push({host:element,count:count});
                    } else {
                        sessionCounts.push({host:element,count:count});
                        callback();
                    }
                })
            });
        }   


    }

在进行此更改时,我注意到我现在必须将变量(collection和sessionCounts)传递给函数,即使函数调用仍在变量定义的范围内。是否有另一种方法可以在不必传递变量的情况下执行此操作,或者是否始终需要这样做,因为它是在定义的变量范围之外定义的模块?

1 个答案:

答案 0 :(得分:0)

是。 JavaScript是词法范围的,不是动态范围的。即使在变量处于活动状态时调用该函数,也无法访问它们,因为该函数不在同一范围内。维基百科的文章http://en.wikipedia.org/wiki/Lexical_scope在解释差异方面做得非常好。