Node.js 变量声明和作用域

IT技术 javascript node.js scope
2021-01-27 16:38:18

当我在 node.js 中输入这个时,我得到undefined.

var testContext = 15;
function testFunction() {
  console.log(this.testContext);
}
testFunction();
=>undefined

没有var关键字,它通过 (=>15)。它在 Chrome 控制台中工作(带和不带var关键字)。

4个回答

使用时它在 Node 中不起作用,var因为它testContext当前module本地您应该直接引用它:console.log(testContext);.

当你不输入时var,发生的事情是testContext现在整个 Node 进程中的一个全局变量

在 Chrome(或任何其他浏览器 - 好吧,我不确定 oldIE ...)中,无论您var在示例中是否使用testContext 都将转到全局上下文,即window.

顺便说一下,“全局上下文”是thisJS 中函数调用的默认值

关键区别在于 Node.js 中的所有module(脚本文件)都在自己的闭包中执行,而 Chrome 和其他浏览器直接在全局范围内执行所有脚本文件。

Globals 文档中提到了这一点

其中一些对象实际上并不在全局范围内,而是在module范围内 - 这将被指出。

var您在 Node module中声明s 将与这些闭包之一隔离,这就是为什么您必须导出其他module的成员才能访问它们。

但是,在function没有特定上下文的情况下调用 a 时,它通常会默认为全局对象——global在 Node.js 中可以方便地调用它。

function testFunction() {
    return this;
}

console.log(testFunction() === global); // true

并且,如果没有var声明它,testContext将默认定义为全局.

testContext = 15;
console.log(global.testContext); // 15
@RobG 我知道每个是什么。但是,这种区别是迂腐的。这很好,我同意你的看法。但是,“范围”仍然是描述一般概念的有效术语,而[[Scope]]范围链和执行上下文是更具体的实现细节。
2021-03-20 16:38:18
通过“关闭”和“范围”,我认为您的意思是“执行上下文”。
2021-03-25 16:38:18
@RobG 它们仍然是有效且常用的术语。但是,是的,ECMA 将它们定义为Execution Contexts
2021-03-27 16:38:18
它们通常被错误地使用,其他一些引用:closurescopeexecution context
2021-03-29 16:38:18

文档中所述

Node.js module中的 var 某些内容将是该module的本地内容。

因此,它会有所不同,因为var testContextis 在module上下文中,而 this 的上下文是global

您也可以使用:

global.testContext = 15;
function testFunction() {
  console.log(this.testContext);
}
testFunction();

我认为问题与this关键字有关。如果你这样做,console.log(this)你会看到 testContext 没有定义。您可能想尝试:

this.testContext = 15;
function testFunction() {
  console.log(this.testContext);
}
testFunction();