var 不附加到全局

Posted

技术标签:

【中文标题】var 不附加到全局【英文标题】:var doesn't attach to global 【发布时间】:2019-11-22 09:09:56 【问题描述】:

我正在尝试理解这个关键字。但问题在于节点环境。我在 Chrome 开发人员工具中得到了预期的行为,但相同的代码在节点环境中无法正常工作。

当我们在全局上下文中创建 var 时,它应该在全局(节点)或窗口(浏览器)内,但在节点环境中,它不会附加到文档。

我只是在测试一个简单的 3 行代码,它在 chrome 中运行良好。

这是针对 Node 环境的

var color = 'red';

console.log(this.color);
console.log(global.color)

这适用于运行良好的浏览器

var color = 'red';

console.log(this.color);
console.log(window.color)

对于节点环境,我收到未定义的未定义。

【问题讨论】:

在 Node 中,代码的作用域总是一个 module Node.js 文件被隐式包装在 IIFE 中,因此它相当于浏览器中的 (function () var color = 'red'; console.log(window.color); )(); Related。 tl;dr 不要依赖 var 附加到全局命名空间。即使它有效,阅读您的代码的人也会感到困惑。 【参考方案1】:

这里有一条软件开发规则:不要依赖粘贴在thisglobalmodule 相关对象上的变量。范围可能会有所不同并导致意外行为和错误。使用显式 (this|global|module.exports).varName 绑定。

但如果你只是想了解 Node 中的工作原理:

代码在执行时被包装到 IIFE 中,将 this 值设置为 module.exports(而不是 global)。 对global的访问在模块间是持久的,所以如果你在一个模块中写global.foo='foo'然后在bar.js中要求它,global.foo将被设置为bar.js中的'foo'不鼓励在大多数用例中直接使用global - 坚持使用exportsrequire。 根据the specs,var 不应该让事情坚持global:有一些例外(见下文),但在编写代码时不应该依赖它

相关问题:

Do let statements create properties on the global object? Meaning of “this” in node.js modules and functions

【讨论】:

好的,所以据我了解,nodejs 中的 this 指的是一个空对象,它是 module.exports,对吧?现在请向我解释一下关于 nodejs 的 global。它是指整个环境并且我们的 module.exprorts 会附加到全局吗? 定义附加 我的意思是 module.exports 使它成为全局属性。但是nvm,我研究了一下,澄清了自己。

以上是关于var 不附加到全局的主要内容,如果未能解决你的问题,请参考以下文章

Alamofire 访问将数据附加到全局变量

如何在python中定义一个全局列表并将本地列表附加到它

搜索附加到全局JS对象的对象

用于附加全局焦点事件的 AngularJS 方式

Google Apps 脚本按钮:我可以分配一个未附加到工作表的“全局”脚本吗?

csv 文件中的模式匹配并附加到匹配的行