未初始化的局部变量的javascript变量范围

时间:2015-02-06 03:53:10

标签: javascript html

我在理解

之间的区别时遇到了问题
for (i = 0; i < 4; i++) {
    var g;
    if (g === undefined) {
        g = 0;
    } else {
        g = g + i;
        alert(g);
    }
}

和这个

for (i = 0; i < 4; i++) {
    var g=0;
    if (g === undefined) {
        g = 0;
    } else {
        g = g + i;
        alert(g);
    }
}
第一个循环输出的

是0,1,3,6,表示g的值在整个迭代过程中没有复位,但是如果g初始化为零,则输出变为0,1,2,3。这告诉我每次var g = 0时,g被设置为零。

这是否意味着如果未初始化局部变量,它们的行为类似于全局变量?

3 个答案:

答案 0 :(得分:4)

这与变量提升和范围有关。由于for循环不会改变javascript中的范围,因此第一个代码块由Javascript解释为

var g;
for (i=0;i < 4;i++)
{
    g=0;
    if(g===undefined)
        g=0;
    else
        g=g+i;
    alert(g);

}
因此,

g在循环的每次迭代时重置,输出&#34; 0 1 2 3&#34;。第二个代码变为

var g;
for (i=0;i < 4;i++)
{
    if(g===undefined)
        g=0;
    else
        g=g+i;
    alert(g);
}

并且不会在循环的每次迭代中重置,从而输出&#34; 0 1 3 6&#34;。

答案 1 :(得分:0)

nope,本地变量是本地变量,第二个循环输出是0, 1, 2, 3,因为您声明了g但没有任何值,因此g===undefined总是true和{{总是受到打击。

在您的第一个循环中输出为g=0,因为0 ,1 ,3 ,6始终为false,因为您声明了g===undefined并为其分配了g,所以0永远不会触摸。

答案 2 :(得分:0)

你的循环输出0,1,2,3所以你正在对你的代码所做的事情进行某种错误的假设。有关正在运行的演示,请参阅http://jsfiddle.net/jfriend00/9uo5g5fo/以查看实际输出。

声明但未初始化的局部变量仍然是局部变量。如果你没有在严格模式下运行,并且在使用它们之前没有声明它们,那么它们只会变成全局变量(这是一个不好的做法)。我不确定你为什么要问这个,因为它不会影响你当前的代码。

当前版本的Javascript(ES5)只有变量的函数作用域,因此函数中的所有变量声明都被提升到函数或作用域的顶部,因此代码:

for (i = 0; i < 4; i++) {
    var g=0;
    if (g === undefined) {
        g = 0;
    } else {
        g = g + i;
        alert(g);
    }
}

相当于:

var g;
for (i = 0; i < 4; i++) {
    g=0;
    if (g === undefined) {
        g = 0;
    } else {
        g = g + i;
        alert(g);
    }
}

您的代码输出0,1,2,3的原因是因为g将在0循环的每次迭代开始时设置为for,因此第一个{{1}永远不会满足,因此if将始终执行,这将导致else被执行。但是,由于g = g + i始终为g,这就像设置0一样,因此您的g = i只会显示alert(g)的值。

您的代码基本上就是这样:

i

仅供参考,Javascript(ES6)的下一个版本提供for (i = 0; i < 4; i++) { alert(i); } 关键字,因此您可以使用块范围声明变量,但该版本仅部分在某些最新版本的浏览器中实现,因此通常不会可用于广泛的浏览器使用。它可以用于Javascript的一些非浏览器使用。