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

javascript variable scope for uninitialized local variables

本文关键字:变量 范围 javascript 局部变量 初始化 用于      更新时间:2023-09-26

我在理解之间的区别时遇到问题

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都被设置为零。

这是否意味着,如果局部变量没有初始化,它们的行为就像全局变量?

这与可变的吊装和范围有关。由于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在循环的每次迭代中重置,输出"0 1 2 3"。第二个代码变为

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

并且在循环的每次迭代中都不会重置,因此输出"0 1 3 6"。

nope,本地变量是本地变量,第二个循环输出是0, 1, 2, 3,因为您声明了g,但没有任何值,所以g===undefined总是trueg=0总是命中。

在您的第一个循环中,输出是0 ,1 ,3 ,6,因为g===undefined总是false,因为您声明了g并将其赋值为0,所以g=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的原因是,在for循环的每次迭代开始时,g将被设置为0,因此永远不会满足第一个if,因此else将始终执行,这将导致g = g + i被执行。但是,由于g始终是0,这将类似于设置g = i,因此您的alert(g)将只显示i的值。

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

for (i = 0; i < 4; i++) {
    alert(i);
}

仅供参考,Javascript的下一个版本(ES6)提供了let关键字,因此您可以用块范围声明变量,但该版本仅在一些最新版本的浏览器中部分实现,因此还不能广泛用于浏览器。它可以用于Javascript的一些非浏览器用途。