请查看此代码并告诉我为什么这个脚本的输出是10
var foo = 1;
function bar() {
if (!foo) {
var foo = 10;
}
alert(foo);
}
bar();
请查看此代码并告诉我为什么这个脚本的输出是10
var foo = 1;
function bar() {
if (!foo) {
var foo = 10;
}
alert(foo);
}
bar();
因为函数中的var
会将变量提升到顶部,就像你在函数顶部声明它一样,所以foo
被视为当前作用域中的局部变量,不会影响全局作用域中的foo
。你的代码与下面的代码相同:
var foo = 1;
function bar() {
var foo;
if (!foo) {
foo = 10;
}
alert(foo);
}
bar();
正如你所看到的,foo
在函数顶部被声明为undefined
,但重要的是直到进入if语句后才赋值。
function ()...
这样声明一个函数意味着它将被提升到其父级的顶部,就像答案中的var
一样。所以函数被声明为a
,这使得a
成为一个局部变量,然后你将1
赋值给a
,所以它不再是一个函数,但仍然像一个局部变量一样处理,所以全局变量没有受到影响。你可以通过将内部函数更改为c
来测试这个理论,然后你会发现全局变量a
被修改了。我不知道有什么工具可以显示它是如何解释的,但一旦你理解了什么是提升和什么不是,就很容易看出来了。 - MrCode