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】:
这里有一条软件开发规则:不要依赖粘贴在this
、global
或module
相关对象上的变量。范围可能会有所不同并导致意外行为和错误。使用显式 (this|global|module.exports).varName
绑定。
但如果你只是想了解 Node 中的工作原理:
代码在执行时被包装到 IIFE 中,将this
值设置为 module.exports
(而不是 global
)。
对global
的访问在模块间是持久的,所以如果你在一个模块中写global.foo='foo'
然后在bar.js
中要求它,global.foo
将被设置为bar.js
中的'foo'
。 不鼓励在大多数用例中直接使用global
- 坚持使用exports
和require
。
根据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 不附加到全局的主要内容,如果未能解决你的问题,请参考以下文章