当我在node.js中输入此内容时,我得到undefined
。
var testContext = 15;
function testFunction() {
console.log(this.testContext);
}
testFunction();
=>undefined
如果没有var
个关键字,则会传递(=> 15)。它在Chrome控制台中运行(包含和不包含var
关键字)。
答案 0 :(得分:47)
使用var
时,它在Node中无效,因为testContext
是当前模块的本地。您应该直接引用它:console.log(testContext);
。
如果您没有输入var
,那么testContext
现在是整个节点流程中的全局变量会发生什么。
在Chrome(或任何其他浏览器中 - 我不确定oldIE ...),如果您在示例中使用var
,则无关紧要{{1 }} 将转到全局上下文,即testContext
。
顺便说一下,"全球背景"是JS中函数调用的默认window
。
答案 1 :(得分:16)
关键区别在于Node.js中的所有模块(脚本文件)都在他们自己的closure中执行,而Chrome和其他浏览器直接在全局范围内执行所有脚本文件。
中提到了这一点其中一些对象实际上并不在全局范围内,而是在模块范围内 - 这将被注意到。
您在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();