JavaScript 浏览器与 NodeJs 的兼容性问题

3

I cannot get why in Browser code like this:

var gLet = 5;
alert(window.gLet); // 5 (become a property of the window object)

虽然它很老,但在Node.js中,这种行为的工作方式不同:

var gVar = 5;
console.log(global.gVar); // undefined (don't become a property of the global object)

但在Node.js中,它的工作方式如下:

gVar = 5;
console.log(global.gVar); // 5 (become a property of the global object)

这意味着Node.js并不完全支持旧的行为?只需尝试理解其中的所有内容即可...

你把那段第二段代码放在哪里?如果是放在一个模块中的话,那不行 - 因为它在模块作用域内。 - VLAZ
NodeJs 中的第二个示例 - Denis Kotov
2个回答

3
每个模块都有自己的作用域,因此当您在模块内使用var声明变量时,它仅在该模块中生效而不是全局生效。
隐式全局变量仍然像往常一样工作。您应该激活严格模式,以避免创建它们。

你的意思是在NodeJs中,每个文件都是CommonJs模块,并且该模块的执行看起来像这样:(function myModule() { var gVar = 5; console.log(global.gVar); })();,我理解得对吗? - Denis Kotov
1
就变量声明的处理方式而言,它在某种程度上是“类似”的。 - Quentin
如果您能在答案中添加此示例(function myModule() { var gVar = 5; console.log(global.gVar); })();,那就太好了,因为并不是所有人都会阅读评论 ;) - Denis Kotov
1
@DenisKotov 问题在于它是不正确的。那不是NodeJS正在运行的代码。这只是一个类似的示例,但每个文件都被视为一个模块,并且它不会直接在全局范围内运行代码。 - VLAZ
1
我给出了一个清晰、简洁的句子解释。它不需要误导性的代码示例。 - Quentin
显示剩余2条评论

0

尝试这个:

  (function myModule() {
      var gVar = 5;
      global.gVar = gVar;
      console.log(global.gVar);
    })();

在这里,您需要在全局对象中首先设置gVar,然后才能看到来自全局的输出gVar。


我没有看到这是对问题的回答。 - Moritz Ringler
您的回答可以通过添加额外的支持信息来改进。请[编辑]以添加更多细节,例如引用或文档,以便其他人可以确认您的答案是否正确。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接