2014-03-30 19 views
1

看起来好像我的私有变量在节点模块中被“重置”。例如。我有一个模块节点模块。私有变量被重置

var exec = require('child_process').exec;  

var process; 

module.exports.start = function() { 
    if (!process) { 
     process = exec('Some process'); 
    } 
}; 

module.exports.stop = function() { 
    if (process) { 
     process.kill(); 
    } 
}; 

,我面对的是,如果我叫startstop功能process变量是未定义的问题在下面的代码。

很明显,解决这个问题的方法是定义一个对象/类并将其暴露在模块中。

但现在我很想知道模块如何在节点中工作。当一个模块为require'd时,所有私有变量会发生什么?

编辑

我使用这个模块从REPL测试,但用法的例子也只是

var my_module = require('./my_module'); 

// the child process starts fine 
my_module.start(); 

// after some time 

// but does not end 
my_module.stop(); 
+1

显示使用此模块的代码... – Justin808

+0

也许'exec'只是*不*返回'undefined'? – Bergi

+0

已经显示了一个例子。 @Bergi no exec返回一个ChildProcess对象。 – Umair

回答

1

node.js文档:http://nodejs.org/api/modules.html

的局部变量模块将是私有的,就像模块被封装在一个函数中一样。

所以你的变量基本上只存在于由模块表示的clouse中。

+0

但我将它设置在'start'函数中。既然它在模块闭包中,那么'stop'函数在被调用时不会收到它的新值? – Umair

+0

它应该捡起来。你正在做一些其他的错误。 “一段时间后”意味着什么? – mihai

+0

我正在REPL中运行该代码,因此在这种情况下,“在一段时间之后”是文字:) – Umair