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();