Javascript nodejs 中的全局变量和属性 - 有时会删除全局属性?

Javascript global variables and properties in nodejs - global properties sometimes deleted?

为什么在节点 (0.10.36) 中 运行 时以下打印 "undefined"?

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

如果省略变量声明(删除第 2 行),'a global property' 将按预期记录。

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

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

似乎在某些情况下,与隐式创建的全局 属性 同名的变量声明导致 属性 被删除?

(我知道使用全局变量通常是不好的做法,我试图了解 nodejs 在处理与全局 属性 和变量声明相关的代码方面与各种浏览器有何不同)。

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'
> 

在 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

因此在您的示例中,第一行设置已声明变量的值 test,即使在语法上它位于声明之前。但是global.test引用了全局变量test,还没有设置