在node.js中存储模块variables的范围是什么?

当我在我的node.js模块中执行此操作时:

var abc = '123'; 

它在哪里? 而我的意思是:在浏览器中它会在window.abc (如果不是在一个函数或其他方面执行)

如果我执行这个:

 abc = '123'; 

然后我可以在global.abcfind它,但这不是我想要的。

与浏览器不同的是,variables默认分配给全局空间(即窗口), 除非您明确地将它们分配给module.exports, 否则节点variables的作用域是模块(文件)。

事实上,当你运行node myfile.jsrequire('somefile.js') ,你的文件中的代码被封装如下:

 (function (exports, require, module, __filename, __dirname) { // your code is here }); 

所有其他答案都是100%正确的,但是我想我会在Node.js应用程序中添加一个展开的/确定的范围列表,以防有人在开始学习Node.js或JavaScript时遇到这个问题。

全球范围

在任何文件中没有var关键字声明的任何东西都可以在Node服务器的同一个实例中运行的任何地方访问:

 // foo.js bar = 'baz'; // qux.js console.log(bar); // prints 'baz' 

请注意,这被广泛认为是一个坏主意,因为它使得你的应用程序强烈地“耦合”,这意味着你必须打开foo.js来解决为什么在qux.js中bar = 'baz'

模块范围

在node.js文件的顶层(不在函数或对象或任何其他块中)使用var关键字声明的任何东西都在模块范围内 ,并且可以从同一文件中的任何地方访问,但不会存在于任何位置其他:

 // foo.js var bar = 'baz'; console.log(bar); // prints 'baz' // qux.js console.log(bar); // prints 'undefined' 

function范围

在函数中使用var关键字声明的任何东西只能从该函数中访问,而不能从其他地方访问:

 // foo.js function myFunction() { var bar = 'baz'; console.log(bar); // prints 'baz' } function myOtherFunction() { console.log(bar); // prints 'undefined' } // qux.js console.log(bar); // prints 'undefined' 

JavaScript是function范围的 。 与其他( 块范围 )语言不同,在函数内的块中声明的variables可以从该父函数的任何其他地方访问 。 例如,这意味着如果你在一个循环内部声明一个新的variables,只要你还在父函数中,它就可以在那个循环之外访问:

 function myFunction() { while (thing === true) { var bar = 'baz'; thing = false; } console.log(bar); // prints 'baz' } 

阴影

如果“重新声明”一个现有的variables,例如,使用已经使用过的variables名的var关键字,那么与该variables名关联的值在新声明的范围内覆盖

 var bar = 'foo'; console.log(bar) // prints 'foo' function myFunction() { var bar = 'baz'; console.log(bar); } myFunction(); // prints 'baz' console.log(bar) // prints 'foo' 

节点有一个模块范围,所以模块中的var abc = '123'将创build一个variables,该variables的作用域是(并且因此只能在代码中访问)该模块。

另见http://nodejs.org/api/globals.html#globals_global