51

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

var abc = '123';

它去哪儿了?我的意思是:在浏览器中它进入window.abc(如果没有在函数中执行或以其他方式执行)

如果我执行这个:

abc = '123';

然后我可以在 中找到它global.abc,但这不是我想要的。

4

4 回答 4

78

与浏览器不同,默认情况下变量被分配给全局空间(即窗口),在 Node 中,变量的范围是模块(文件),除非您明确地将它们分配给 module.exports。

实际上,当您运行node myfile.jsrequire('somefile.js')文件中的代码包装如下:

(function (exports, require, module, __filename, __dirname) {
     // your code is here
});
于 2013-03-14T13:53:17.667 回答
74

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

全球范围

任何文件中没有关键字声明的var任何内容都可以从运行在同一节点服务器实例中的任何地方访问:

// foo.js
bar = 'baz';


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

请注意,这被广泛认为是一个坏主意,因为它使您的应用程序强“耦合”——这意味着您必须打开 foo.js 才能bar = 'baz'在 qux.js 中找出原因

模块范围

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

// 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 是函数作用域的。与其他(块范围的)语言不同,在函数内的块中声明的变量可以从该父函数的任何其他地方访问。例如,这意味着如果您在循环内声明一个新变量,那么只要您仍在父函数内,它也可以在该循环外访问:

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'
于 2016-02-16T12:48:39.273 回答
5

Node 有一个模块作用域,因此var abc = '123'在一个模块中将创建一个作用域为该模块的变量(因此,仅对其中的代码可访问)。

另请参阅http://nodejs.org/api/globals.html#globals_global

于 2013-03-14T10:19:07.537 回答
4

很老的问题,如果有人对这个问题的 ECMA 规范感到好奇,这里是链接

并且无法直接访问模块变量(导入的模块除外):

词法环境和环境记录值纯粹是规范机制,不需要对应于 ECMAScript 实现的任何特定工件。ECMAScript 程序不可能直接访问或操作这些值。

于 2018-05-20T22:38:57.727 回答