Node.jsvariables声明和范围

当我在node.js中input时,我得到了undefined

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

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

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

当你不inputvar ,会发生什么情况是testContext现在是整个Node进程中的全局 testContext

在Chrome浏览器(或任何其他浏览器 – 呃,我不确定oldIE …),如果您在您的示例中使用var或不,无关紧要, testContext 将转到全局上下文 ,这是window

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

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

这在全局文档中提到:

其中一些对象实际上并不在全局范围内,而是在模块范围内 – 这一点将会被注意到。

您在Node模块中声明的variables将被隔离到其中一个闭包中,这就是为什么您必须导出其他模块的成员才能到达它们的原因。

但是,当调用一个没有特定上下文的function时,它通常会被默认为全局对象 – 这在Node中被称为global

 function testFunction() { return this; } console.log(testFunction() === global); // true 

而且,如果没有var声明, testContext将被默认定义为全局的 。

 testContext = 15; console.log(global.testContext); // 15 

正如文件中所提到的那样

在一个Node.js模块中的var的东西将是本地模块。

所以,这将是不同的,因为var testContext在模块上下文中,而上下文是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();