Node.js变量声明和范围

时间:2013-11-08 01:55:08

标签: javascript node.js scope

当我在node.js中输入此内容时,我得到undefined

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

如果没有var个关键字,则会传递(=> 15)。它在Chrome控制台中运行(包含和不包含var关键字)。

4 个答案:

答案 0 :(得分:47)

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

如果您没有输入var,那么testContext现在是整个节点流程中的全局变量会发生什么。

在Chrome(或任何其他浏览器中 - 我不确定oldIE ...),如果您在示例中使用var,则无关紧要{{1 }} 将转到全局上下文,即testContext

顺便说一下,"全球背景"是JS中函数调用的默认window

答案 1 :(得分:16)

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

Globals documentation

中提到了这一点
  

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

您在Node模块中声明的var将被隔离到其中一个闭包,这就是为什么您必须export members才能让其他模块联系到它们。

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

function testFunction() {
    return this;
}

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

而且,如果var没有声明,testContext将默认为defined as a global

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

答案 2 :(得分:4)

正如document

中所述
  Node.js模块中的

var将是该模块的本地内容。

所以,它会有所不同,因为var testContext位于模块上下文中,其上下文为global

您也可以使用:

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

答案 3 :(得分:0)

我认为问题与this关键字有关。如果执行console.log(this),您将看到未定义testContext。您可以尝试:

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