为什么这个JavaScript函数的输出是10?

3

请查看此代码并告诉我为什么这个脚本的输出是10

var foo = 1;
function bar() {
    if (!foo) {
        var foo = 10;
    }
    alert(foo);
}
bar();
1个回答

5

因为函数中的var会将变量提升到顶部,就像你在函数顶部声明它一样,所以foo被视为当前作用域中的局部变量,不会影响全局作用域中的foo。你的代码与下面的代码相同:

var foo = 1;
function bar() {
    var foo;
    if (!foo) {
        foo = 10;
    }
    alert(foo);
}
bar();

正如你所看到的,foo在函数顶部被声明为undefined,但重要的是直到进入if语句后才赋值。


谢谢 - 明白了。解释得很好。 - SharpCoder
有没有办法检查代码实际上是如何被解释的? - SharpCoder
你能否解释一下这里发生了什么 http://jsfiddle.net/4Wx8j/ 吗?我知道这与变量提升有关,但我真的不明白为什么。 - SharpCoder
你说得对,这就是提升。像 function ()... 这样声明一个函数意味着它将被提升到其父级的顶部,就像答案中的 var 一样。所以函数被声明为 a,这使得 a 成为一个局部变量,然后你将 1 赋值给 a,所以它不再是一个函数,但仍然像一个局部变量一样处理,所以全局变量没有受到影响。你可以通过将内部函数更改为 c 来测试这个理论,然后你会发现全局变量 a 被修改了。我不知道有什么工具可以显示它是如何解释的,但一旦你理解了什么是提升和什么不是,就很容易看出来了。 - MrCode
谢谢MrCode。我喜欢你的解释和你的名字。MrCode是一个很酷的名字 :) - SharpCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接