当我在node.js模块中执行此操作时:
var abc = '123';
它去哪儿了?我的意思是:在浏览器中它进入window.abc
(如果没有在函数中执行或其他方式)
如果我执行此操作:
abc = '123';
然后我可以在global.abc
中找到它,但这不是我想要的。
答案 0 :(得分:58)
与浏览器不同,默认情况下,变量分配给全局空间(即窗口),节点变量的范围限定为模块(文件),除非您明确将它们分配给module.exports
事实上,当您运行node myfile.js
或require('somefile.js')
时,文件中的代码将包含如下:
(function (exports, require, module, __filename, __dirname) {
// your code is here
});
答案 1 :(得分:47)
所有其他答案都是100%正确,但我想我会在Node.js应用程序中添加一个扩展/确定的范围列表,以防任何人在开始学习Node.js或JavaScript时遇到这个问题:
任何文件中没有var
关键字声明的内容都可以在节点服务器的同一实例中运行的任何地方访问:
// foo.js
bar = 'baz';
// qux.js
console.log(bar); // prints 'baz'
请注意,这被广泛认为是一个坏主意,因为它会使您的应用程序强烈“耦合” - 意味着您必须打开foo.js以找出qux.js中的bar = 'baz'
< / p>
在node.js文件的顶层(不在函数或对象或任何其他块内)使用var
关键字声明的任何内容都在模块范围中,并且可以从同一文件中的任何位置访问,但在其他任何地方都不存在:
// foo.js
var bar = 'baz';
console.log(bar); // prints 'baz'
// qux.js
console.log(bar); // prints 'undefined'
在函数中使用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 is function scoped。与其他(块范围的)语言不同,在函数中的块中声明的变量可以从该父函数中的任何其他位置访问。例如,这意味着如果在循环内部声明一个新变量,它也可以在该循环之外访问,只要你仍然在父函数内:
function myFunction() {
while (thing === true) {
var bar = 'baz';
thing = false;
}
console.log(bar); // prints 'baz'
}
如果您'重新声明'现有变量,例如使用已经使用过的变量名var
关键字,然后在新声明的范围内覆盖与该变量名相关联的值:
var bar = 'foo';
console.log(bar) // prints 'foo'
function myFunction() {
var bar = 'baz';
console.log(bar);
}
myFunction(); // prints 'baz'
console.log(bar) // prints 'foo'
答案 2 :(得分:3)
Node有一个模块范围,因此模块中的var abc = '123'
将创建一个变量,该变量的范围限定(因此只能代码中的代码)该模块。
答案 3 :(得分:2)
相当古老的问题,如果有人对ECMA关于这个问题的规范感到好奇,这里是link
并且无法直接访问模块变量(导入的模块除外):
词法环境和环境记录值是纯粹的规范机制,不需要与ECMAScript实现的任何特定人工制品相对应。 ECMAScript程序不可能直接访问或操纵这些值。