【问题标题】:Why does this code behave differently in NodeJS? [duplicate]为什么这段代码在 NodeJS 中表现不同? [复制]
【发布时间】:2020-07-23 06:54:06
【问题描述】:

在浏览器和 NodeJS REPL 中,以下打印 true,但在 NodeJS 下作为文件(即node filename.js)运行,它打印 false。为什么?

在非严格模式下,在全局上下文中。

var x = 1
console.log(window.hasOwnProperty('x')) // replace `window` with `global` for NodeJS

我确定我遗漏了一些明显的东西。

【问题讨论】:

  • Node 对浏览器上下文中的全局 (window) 变量具有模块作用域。
  • 我会接受这个答案。
  • @52d6c6af 这是文档的link,清楚地解释了这一点。
  • 该文档肯定是错误的。 Node 中的顶级范围是 全局范围 - 否则内在函数将超出模块的范围。只是模块中的变量声明发生在模块的范围内。
  • @52d6c6af 表示“[模块代码]的顶级范围不是全局范围”,其中“顶级”指的是评估代码,不是整个程序的范围层次结构。

标签: javascript


【解决方案1】:

它们的行为不同,因为 Node.js 将每个模块包装在一个函数中,因此变量的范围不限于全局对象(windowglobal 等):

The module wrapper

在执行模块的代码之前,Node.js 将使用如下所示的函数包装器来包装它:

(function(exports, require, module, __filename, __dirname) {
// Module code actually lives in here
});

通过这样做,Node.js 实现了一些目标:

  • 它将顶级变量(使用varconstlet 定义)保留在模块而不是全局对象的范围内。
  • 它有助于提供一些实际上特定于模块的全局变量,例如:

    • 实现者可用于从模块中导出值的 moduleexports 对象。
    • 便利变量__filename__dirname,包含模块的绝对文件名和目录路径。

【讨论】:

  • 本机模块如何改变?
  • @52d6c6af 不是真的。 ES6 模块仍然有自己的作用域。
猜你喜欢
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多