我正在尝试使用以下(改编的)Node.js脚本重现deceze对Is 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
关键字的情况下定义的,因此在它到达并附加到全局对象之前“冒泡”。
为什么不是这样?
(我还有第二个问题:在原始答案中,函数名称myfunc
和innermyfunc
不存在,但这会导致SyntaxError
。是否不允许定义Node中的匿名函数?)
答案 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
(或const
或let
),您可以轻松地查看它们,并了解它们应限定在文件范围内。我保证,这将为你节省一些寻找虫子的时间。
答案 1 :(得分:0)
您需要运行功能
function func(){
a = 5;
}
console.log(a); // a is not defined
func();
console.log(a); // 5
答案 2 :(得分:0)
您必须运行要声明的xyz函数。如果您使用严格模式,这也会引发错误。