Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为什么访问不使用'var'声明的变量时,不必在其他文件中使用'require'?_Node.js - Fatal编程技术网

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。我强烈建议同时使用这两种模式。它们捕获不同的内容。您不能将
模块作为函数参数导出。您是对的,我的目的是传达实际传递的内容以及节点模块内导出所引用的内容。这只是出口,但为了增加更多的语义,我这样做了。我现在已经改正了