在Node脚本中,没有'var'定义的变量似乎不在全局范围内

时间:2017-11-08 20:48:12

标签: javascript node.js

我正在尝试使用以下(改编的)Node.js脚本重现decezeIs using 'var' to declare variables optional?的回答:

var foo = "I'm global";
var bar = "So am I";

function myfunc() {
    var foo = "I'm local, the previous 'foo' didn't notice a thing";
    var baz = "I'm local, too";

    function innermyfunc() {
        var foo = "I'm even more local, all three 'foos' have different values";
        baz = "I just changed 'baz' one scope higher, but it's still not global";
        bar = "I just changed the global 'bar' variable";
        xyz = "I just created a new global variable";
    }
}

console.log(xyz)

但是,这会导致

console.log(xyz)
            ^

ReferenceError: xyz is not defined

但是,正如我从他的回答中所理解的那样,这应该是"I just created a new global variable",因为它是在没有var关键字的情况下定义的,因此在它到达并附加到全局对象之前“冒泡”。

为什么不是这样?

(我还有第二个问题:在原始答案中,函数名称myfuncinnermyfunc不存在,但这会导致SyntaxError。是否不允许定义Node中的匿名函数?)

3 个答案:

答案 0 :(得分:2)

在您实际调用函数之前,不会声明变量xyz。然后xyz将在文件的范围内(但不是真正的全局),并且您的console.log()应该按预期工作。

例如,这会将字符串记录到控制台:

function myfunc() {

    function innermyfunc() {
        xyz = "I just created a new global variable";
    }
    innermyfunc()
}

myfunc()
console.log(xyz)

话虽如此,如此声明变量是一种普遍接受的不良做法。最好在文件顶部使用var xyz(或constlet),您可以轻松地查看它们,并了解它们应限定在文件范围内。我保证,这将为你节省一些寻找虫子的时间。

答案 1 :(得分:0)

您需要运行功能

function func(){
    a = 5;
}
console.log(a); // a is not defined
func();
console.log(a); // 5

答案 2 :(得分:0)

您必须运行要声明的xyz函数。如果您使用严格模式,这也会引发错误。