Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于javascript中的作用域,为什么下面的输出不是21而是22?_Javascript - Fatal编程技术网

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

关于javascript中的作用域,为什么下面的输出不是21而是22?,javascript,Javascript,有人知道原因吗?因为JavaScript(以及ECMAScript)没有块作用域。只是功能范围 实际上,函数顶部只有一个变量声明,因此x=2覆盖了1的初始值 function t() { var x = 1; if(true) { var x = 2; alert(x); } alert(x); } t(); Javascript中的变量的作用域是函数,而不是块。您有两个vars,但实际上只有一个x在整个函数中应用“var

有人知道原因吗?

因为JavaScript(以及ECMAScript)没有块作用域。只是功能范围

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

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

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

在整个函数中应用“var”关键字,因此您的代码的行为与此相同:

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

不是很乐观的“现在”。我怀疑这种情况永远不会改变。想象一下打破几十年的代码的噩梦。编辑:我纠正了,你编辑的链接提供了一些我没有考虑的额外的见解。@安东尼:如果你的代码在浏览器中运行,那么非常正确。在独立JS引擎的浏览器之外,我们有理由保持乐观(甚至在今天享受它)o) 欢迎使用javascript:)
function t() {
    var x = 1;
    if (true) {
        x = 2;
        alert(x);
    }
    alert(x);
}
t();