2015-02-06 43 views
1

为什么在节点(0.10.36)中运行时会打印“undefined”?Javascript全局变量和nodejs中的属性 - 全局属性有时会被删除?

test = 'a global property'; 
var test = 'a variable'; 
console.log(global.test); 

如果省略变量声明(删除第2行),则按预期方式记录“全局属性”。

如果全局属性通过global.test = 'a global property'在全局对象上显式设置,那么它也按预期记录。我认为这两个语句是等价的:

test = 'foo'; 
global.test = 'foo'; 

它几乎好像有一些情况下使用相同的名称作为隐式创建的全局属性变量声明导致该财产被删除? (我理解使用globals通常是不好的做法,我想了解nodejs在处理与全局属性和变量声明有关的代码时如何与各种浏览器不同)。

+3

如果你在全局范围内工作,'test'和'var test'是等价的。 – Aweary 2015-02-06 22:36:22

+1

@Aweary:这是nodejs。你永远不会在全球范围内。如果你使用'var',变量只能在这个文件中访问;否则它将从任何文件访问。这是一个重要的区别,因为真正的全球变量被强烈阻止。 – 2015-02-07 00:03:42

+0

这是一个重要的区别,很好的标注。我使用术语global来将它与当前Node环境中的函数的局部范围进行对比,但是您是对的,它并不像您在其他环境中发现的那样是全球性的。 – Aweary 2015-02-07 00:10:07

回答

1

在JavaScript中,变量声明适用于整个文件(或最内层函数定义,如果有的话):

pi = 3.14159265359; // refers to declared variable pi 
var pi; 
function myFn() { 
    x = 1.618034;  // refers to declared variable x 
    if (...) { 
     while (...) { 
      var x; // declaration only happens once each time myFn is called 
     } 
    } 
} 
x = 2.7182818;  // refers to global variable x 
在你的榜样

所以,第一行设置声明的变量的值即使在语法上它是在声明之前。但是global.test引用了尚未设置的全局变量test

+0

啊,再次提醒罢工!所以,我的原代码,相当于 '变种测试;'' 测试=“一个全球性的财产”;'' 测试=“变量”;' 意味着一个全局属性是** **从来没有设置。谢谢! – user4539116 2015-02-07 01:17:18

0

var不会自动让您远离全球范围。如果您在全局命名空间中的Node中工作(比如说,在Node REPL中,我在这里测试过)var test仍然是全局作用域,除非您在函数中定义它。

//assign global without var 
> test = 'global variable' 
'global variable' 
//this is still global, so it re-writes the variable 
> var test = 'still global' 
undefined 
> test 
'still global' 
//if we defined test in a local scope and return it, its different 
> var returnVar = function(){ var test = 'local test'; return test } 
undefined 
//and the global test variable is still the same 
> test 
'still global' 
> returnVar() 
'local test' 
>