Node.js变量声明和范围

IGR*_*ACH 37 javascript scope node.js

当我在node.js中键入它时,我得到了undefined.

var testContext = 15;
function testFunction() {
  console.log(this.testContext);
}
testFunction();
=>undefined
Run Code Online (Sandbox Code Playgroud)

没有var关键字,它传递(=> 15).它在Chrome控制台中运行(有和没有var关键字).

gus*_*nke 49

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

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

在Chrome(或任何其他浏览器 - 好吧,我不确定oldIE ...)中,如果你var在你的例子中使用或不使用,那么testContext 将转到全局上下文,这是window.

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


Jon*_*ski 17

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

这在Globals文档中提到:

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

var您节点模块中声明旨意被隔离到这些盖子的一个,这就是为什么你必须输出部件其他模块,以达到他们.

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

function testFunction() {
    return this;
}

console.log(testFunction() === global); // true
Run Code Online (Sandbox Code Playgroud)

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

testContext = 15;
console.log(global.testContext); // 15
Run Code Online (Sandbox Code Playgroud)


pra*_*sun 5

文档中所述

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

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

您也可以使用:

global.testContext = 15;
function testFunction() {
  console.log(this.testContext);
}
testFunction();
Run Code Online (Sandbox Code Playgroud)