47

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

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

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

4

4 回答 4

59

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

当您不键入var时,会发生什么testContext现在是整个 Node 进程中的全局变量

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

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

于 2013-11-08T02:03:06.273 回答
19

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

Globals 文档中提到了这一点:

其中一些对象实际上不在全局范围内,而是在模块范围内——这将被记录下来。

您在 Node 模块中声明的vars 将与这些闭包之一隔离,这就是您必须导出成员以供其他模块访问它们的原因。

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

function testFunction() {
    return this;
}

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

并且,如果没有var声明它,testContext将默认被定义为 global

testContext = 15;
console.log(global.testContext); // 15
于 2013-11-08T02:18:55.097 回答
5

文件中所述

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

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

您也可以使用:

global.testContext = 15;
function testFunction() {
  console.log(this.testContext);
}
testFunction();
于 2015-11-25T06:21:48.113 回答
0

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

this.testContext = 15;
function testFunction() {
  console.log(this.testContext);
}
testFunction();
于 2013-11-08T02:01:23.120 回答