Javascript 节点js中的全局环境行为

Javascript 节点js中的全局环境行为,javascript,node.js,scope,Javascript,Node.js,Scope,在Javascript中,我知道的是,作用域是使用称为声明性环境记录的数据结构来处理的,全局环境有一个额外的称为对象环境记录的数据结构 对象环境记录处理var和函数声明 声明性环境记录处理let、const和class声明 但是,在Node.js中,这种行为似乎并不遵循上述规则。作为 //in node.js var a = 1; console.log(global.a) //prints undefined so OER didn't handle this de

在Javascript中,我知道的是,作用域是使用称为声明性环境记录的数据结构来处理的,全局环境有一个额外的称为对象环境记录的数据结构

  • 对象环境记录处理var函数声明
  • 声明性环境记录处理letconstclass声明
但是,在Node.js中,这种行为似乎并不遵循上述规则。作为

    //in node.js
    var a = 1;
    console.log(global.a) //prints undefined so OER didn't handle this declaration

    b = 2;
    console.log(global.b) //prints 2 so declarations without var makes the OER handle the variable declaration
那么,DER对象是否处理var和函数声明,而不是Node.js中的OER?它是否在模块之间共享,同时又像OER一样需要它们

Ex

//module foo.js
var x = 10;
y = 20;
在另一个文件中

//module bar.js
var foo = require("./foo");
console.log(x) //undefined
console.log(y) //prints 20

a
global.a
看起来是一样的。@VLAZ在javascript中(在浏览器而不是node.js环境中运行)全局变量是全局对象中的一个属性,因此使用a与此相同。a但我的问题是,这种行为在node中不会发生。我已将您链接到运行node.js和
var a=1
的某个对象,然后是
console.log(a,global.a)
打印
11
,因此
var
声明确实会附加到全局对象。但在windows 8.1中我没有这样做。好的,这现在在模块范围内,不在全局范围内。模块范围的规则旨在隔离行为,否则加载定义
var foo=1
moduleA
和定义
var foo=2
moduleB
可能会导致错误行为,即使您不打算这样做,并且肯定会影响加载顺序。因此,如果需要全局变量,为什么需要显式
a
global.a
看起来是一样的。@VLAZ在javascript中(在浏览器而不是node.js环境中运行)全局变量是全局对象中的一个属性,因此使用a与此相同。a但我的问题是,这种行为在node中不会发生。我已经将您链接到运行node.js和
var a=1
的某个对象,然后是
console.log(a,global.a)
打印
11
,因此
var
声明确实会附加到全局对象。但在windows 8.1中我没有这样做。好的,这现在在模块范围内,不在全局范围内。模块范围的规则旨在隔离行为,否则加载定义
var foo=1
moduleA
和定义
var foo=2
moduleB
可能会导致错误行为,即使您不打算这样做,并且肯定会影响加载顺序。因此,如果需要全局变量,为什么需要显式。