4

这是一个例子

$ cat main.js
App = {
  version : 1.1
};
require('./mymod.js');

$ cat mymod.js
console.log(App.version);

$ node main.js
1.1

请注意我如何App在 main.js 中声明而没有var. 这使我无需致电即可访问App。如果我用 a声明,这将不起作用。mymod.jsrequireAppvar

我想了解为什么会这样?它是 node.js 的预期行为还是错误?这种行为是否符合 ECMAScript 或 CommonJS 标准?

这个技巧提供了一个强大的机制来绕过requirenode.js 的模块系统。在每个文件中定义您的对象并将它们添加到顶级App命名空间。您在其他文件中的代码将自动访问这些对象。我错过了什么?

4

4 回答 4

9

如果不使用 var 分配变量,它会自动成为全局变量。这就是 JavaScript 的工作方式。如果您将'use strict';(需要引号)放在 js 文件的顶部,则会变成错误。

于 2013-07-30T15:57:00.137 回答
1

定义不带前缀的变量var会将其放入所有 JavaScript 代码可见的全局命名空间中。

虽然这似乎是一个有用的功能,但通常认为“污染”全局命名空间是不好的做法,并且当两个不相关的文件都依赖或定义具有相同名称的变量时,可能会导致微妙的、难以定位的错误。

于 2013-07-30T15:57:41.013 回答
1

一切都与本地范围与全局范围有关。

你甚至可以这样做(这更整洁):

应用程序.js:

exports = {
  version : 1.1
}; 

主.js:

var App = require('./app.js');
console.log(App.version);
于 2013-07-30T15:53:44.363 回答
0

在 nodeJS 环境中,有一个由 'global' 引用的全局范围,就像我们在浏览器环境中拥有 'window' 的方式一样。实际上,每个 javascript 宿主环境总是从创建全局对象开始。

执行 require('main.js') 时,会针对全局范围“global”创建并执行以下函数。

(function(exports,...){
   //content of main.js
   App = {
     version : 1.1
  };
})(module.exports,..);

执行上述函数时,由于 App 没有 var 声明,因此会在全局对象上创建一个名为“App”的属性并为其赋值。此行为符合 ECMA 规范。

这就是应用程序如何进入全局范围并可以跨所有模块访问的方式。

require已被引入以标准化可移植和使用的模块的开发。

于 2013-07-30T16:07:04.277 回答