【问题标题】:var doesn't attach to globalvar 不附加到全局
【发布时间】: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 附加到全局命名空间。即使它有效,阅读您的代码的人也会感到困惑。

标签: javascript node.js this 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 specsvar 不应该让事情坚持global:有一些例外(见下文),但在编写代码时不应该依赖它

相关问题:

【讨论】:

  • 好的,所以据我了解,nodejs 中的 this 指的是一个空对象,它是 module.exports,对吧?现在请向我解释一下关于 nodejs 的 global。它是指整个环境并且我们的 module.exprorts 会附加到全局吗?
  • 定义附加
  • 我的意思是 module.exports 使它成为全局属性。但是nvm,我研究了一下,澄清了自己。
猜你喜欢
  • 2018-10-12
  • 2015-12-23
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
  • 2020-05-20
  • 2011-10-17
  • 2016-10-05
相关资源
最近更新 更多