Javascript Node.js在哪个对象中存储变量?

Javascript Node.js在哪个对象中存储变量?,javascript,node.js,Javascript,Node.js,在my server.js中: 如果我键入: var yo = 123; console.log(global.yo); // undefined console.log(this.yo); // undefined 在浏览器中,这将是window.yo,那么在存储此变量的节点中是否存在某个对象?简短回答:否 稍长一点的回答: Node.js文档: 在浏览器中,顶级作用域是全局作用域。这意味着,在浏览器中,如果您在全局范围var中,则会定义一个全局变量。在节点中,这是不同的。顶层范围不是全局范

在my server.js中:

如果我键入:

var yo = 123;
console.log(global.yo); // undefined
console.log(this.yo); // undefined
在浏览器中,这将是window.yo,那么在存储此变量的节点中是否存在某个对象?

简短回答:否

稍长一点的回答:

Node.js文档:

在浏览器中,顶级作用域是全局作用域。这意味着,在浏览器中,如果您在全局范围
var中,则会定义一个全局变量。在节点中,这是不同的。顶层范围不是全局范围<代码>变量节点模块内的某些内容将位于该模块的本地

需要记住的一点是,在Node.js中,所有内容都是一个模块。这包括条目文件(即作为
节点blah.js运行的文件)。因此,每个变量都是其模块的局部变量,它们在
global
上无法访问,就像在浏览器的
窗口中一样:

var yo = 123;
console.log(window.yo); //⇒ 123
但在节点中:

var yo = 123;
console.log(global.yo); //⇒ undefined
console.log(module.yo); //⇒ undefined

但是,我找不到任何文档指出这种行为。

当您在javascript中用'var'关键字声明变量时,它将在局部范围内定义变量

特别是对于浏览器,在全局范围内对变量进行解除锁定将其设置为window

在节点declerin中,带有var的变量始终是局部变量。我们永远不会没有范围。我们将始终具有模块级


因此,不,变量没有分配给任何对象。

JavaScript,无论是在浏览器上还是在服务器上,都不会在任何对象上存储本地声明的变量,它们只存在于作用域中(不能作为任何对象的属性访问)

唯一的例外是全局变量,它们可以作为全局对象(语言术语)的属性访问。在浏览器中,该对象显示为,在节点中显示为。它也是全局代码中该
绑定的值

如其他答案中所述,使用节点执行的文件不是全局代码,而是存在于模块范围内,因此对于任何声明的变量,您通常不会观察到这种行为。它在REPL中工作,但是:

$ node
> var yo = 123;
> global.yo
123
^C
$ echo "var yo = 123; console.log(global.yo)" > test.js
$ node test.js
undefined
$ echo "yo = 123; console.log(global.yo)" > test.js
$ node test.js
123

在浏览器中,全局范围中的var x=2会将window.x设置为2。显然,node的情况并非如此。简短的回答当然是正确的,但奇怪的是,如果您从cmd行运行node,并使用var y=123手动定义y,它将设置GLOBAL.y,这是我的答案的基础。是的,node REPL做的事情有点奇怪。这是因为模块在自己的沙盒中运行,javascript语言将其指定为“全局对象”。传统上,浏览器称全局对象为“窗口”,但这种语言并不要求这样。它只要求全局对象存在。该语言也不要求程序员可以访问全局对象。而且,该语言的较新版本允许您在启用严格模式时阻止
this
引用全局对象。