一尘不染

什么是NodeJS中的“全局”对象

node.js

我刚刚this在NodeJS环境中看到关键字的奇怪行为。我正在用代码列出它们。我已经使用NodeJS v6.x,用一个JavaScript文件运行了这些代码。

如下用一行代码进行测试时,无论是否使用该'use strict'语句,这都指向一个空对象{}

console.log(this)

但是,当我在自执行函数中运行语句时,

(function(){
  console.log(this);
}());

它正在打印一个非常大的对象。在我看来,环境创建的全局执行上下文对象NodeJS

并且在执行带有'use strict'语句的上述功能时,预期它正在打印undefined

(function(){
  'use strict';

  console.log(this);
}());

但是,在使用浏览器时(我仅使用进行了测试Chrome),前三个示例产生了该window对象,而最后一个给出了undefined预期的对象。

浏览器的行为是可以理解的。但是,在的情况NodeJS下,直到我将其包装在函数中时,它才会创建执行上下文吗?

因此,大多数代码NodeJS运行时都带有一个空的 global object吗?


阅读 523

收藏
2020-07-07

共1个答案

一尘不染

在浏览器中,全局范围是window对象,而在nodeJS中,模块的全局范围是模块本身,因此,当您在nodeJS模块的全局范围中定义变量时,该变量将在该模块本地。

您可以在 NodeJS文档
中阅读有关此内容的更多信息,其中指出:

全球

<Object> The global namespace object.

在浏览器中,顶级范围是全局范围。这意味着在浏览器中,如果您位于全局作用域var中,则将定义一个全局变量。在Node.js中,这是不同的。顶级范围不是全局范围;var
Node.js模块内部的某些内容对于该模块而言是本地的。

在您编写的代码中:

  • console.log(this)在一个空的js文件(模块)中,它将打印一个{}引用您的空模块的空对象。
  • console.log(this);自调用函数中,this将指向包含了所有常见的NodeJS属性和诸如方法在全球范围内的NodeJS对象require()moduleexportsconsole
  • console.log(this)在自我调用函数中具有 严格模式undefined的情况下,由于在严格模式下自我调用的函数没有默认的本地作用域对象,它将打印。
2020-07-07