关于javascript的范围,为什么以下不输出21但是22?

时间:2011-08-17 01:36:52

标签: javascript

function t()
{
    var x = 1;
    if(true)
    {
        var x = 2;
        alert(x);
    }
    alert(x);
}
t();

任何人都知道原因吗?

3 个答案:

答案 0 :(得分:6)

因为JavaScript(井ECMAScript)没有块范围(yet)。只是功能范围。

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

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();

答案 1 :(得分:3)

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

function t() {
    var x = 1;
    if (true) {
        x = 2;
        alert(x);
    }
    alert(x);
}
t();

答案 2 :(得分:1)

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