Node.js 为什么访问不使用'var'声明的变量时,不必在其他文件中使用'require'?
这里有一个例子Node.js 为什么访问不使用'var'声明的变量时,不必在其他文件中使用'require'?,node.js,Node.js,这里有一个例子 $ cat main.js App = { version : 1.1 }; require('./mymod.js'); $ cat mymod.js console.log(App.version); $ node main.js 1.1 注意我是如何在main.js中声明App,而不使用var。这允许我从mymod.js访问App,而无需调用require。如果我使用var声明App,这将不起作用 我想知道为什么会这样?这是node.js的预期行为还是bug?此行
$ cat main.js
App = {
version : 1.1
};
require('./mymod.js');
$ cat mymod.js
console.log(App.version);
$ node main.js
1.1
注意我是如何在main.js中声明App
,而不使用var
。这允许我从mymod.js
访问App
,而无需调用require
。如果我使用var
声明App
,这将不起作用
我想知道为什么会这样?这是node.js的预期行为还是bug?此行为是否符合ECMAScript或CommonJS标准
这个技巧提供了一个强大的机制来绕过node.js的
require
模块系统。在每个文件中定义对象并将其添加到顶级App
命名空间。其他文件中的代码将自动访问这些对象。我遗漏了什么吗?所有这些都与局部范围和全局范围有关
你甚至可以这样做(更整洁):
app.js:
exports = {
version : 1.1
};
main.js:
var App = require('./app.js');
console.log(App.version);
如果不使用var分配变量,则该变量将自动成为全局变量。这就是JavaScript的工作方式。如果你把
“严格使用”代码>(需要引号)在js文件的顶部,这将变成一个错误。定义一个没有前面的var
的变量将把它放在全局名称空间中,该名称空间对所有JavaScript代码都可见
虽然这似乎是一个有用的功能,但通常认为“污染”全局名称空间是一种不好的做法,当两个不相关的文件都依赖或定义具有相同名称的变量时,可能会导致微妙的、难以定位的错误。在nodeJS环境中,有一个全局范围被“global”引用,就像浏览器环境中的“窗口”一样。实际上,每个javascript主机环境总是从创建全局对象开始
在执行require('main.js')时,将针对全局作用域'global'创建并执行以下函数
(function(exports,...){
//content of main.js
App = {
version : 1.1
};
})(module.exports,..);
执行上述函数时,由于App没有var声明,将在全局对象上创建一个名为“App”的属性并为其赋值。此行为符合ECMA规范
这就是应用程序进入全局范围并可跨所有模块访问的方式
require
已被引入,以标准化可移植和使用的模块的开发。强烈建议在NodeJS中编程时使用严格模式和/或良好的linter。我强烈建议同时使用这两种模式。它们捕获不同的内容。您不能将模块作为函数参数导出。您是对的,我的目的是传达实际传递的内容以及节点模块内导出所引用的内容。这只是出口,但为了增加更多的语义,我这样做了。我现在已经改正了