关于javascript中的作用域,为什么下面的输出不是21而是22?

About the scope in javascript,why the following not output 21 but 22?

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
7
8
9
10
11
function t()
{
    var x = 1;
    if(true)
    {
        var x = 2;
        alert(x);
    }
    alert(x);
}
t();

有人知道原因吗?


因为javascript(好的ecmascript)还没有块作用域。只是功能范围。

实际上只有一个变量声明被提升到函数的顶部,所以x=2覆盖了1的初始值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function t()
{
    var x = 1;

       // v---------immediately invoked function to create a new scope
    (function() {
          // new variable scope
        if(true)
        {
            var x = 2;
            alert(x); // 2
        }
    })();

    alert(x); // 1
}
t();


"var"关键字应用于整个函数中,因此您拥有的代码的行为将与此相同:

1
2
3
4
5
6
7
8
9
function t() {
    var x = 1;
    if (true) {
        x = 2;
        alert(x);
    }
    alert(x);
}
t();


javascript中的变量的作用域是函数,而不是块。你有两个var,但实际上只有一个x