Javascript 节点js中的全局环境行为
在Javascript中,我知道的是,作用域是使用称为声明性环境记录的数据结构来处理的,全局环境有一个额外的称为对象环境记录的数据结构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
- 对象环境记录处理var和函数声明
- 声明性环境记录处理let、const和class声明
//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
可能会导致错误行为,即使您不打算这样做,并且肯定会影响加载顺序。因此,如果需要全局变量,为什么需要显式。