我在理解
之间的区别时遇到了问题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被设置为零。
这是否意味着如果未初始化局部变量,它们的行为类似于全局变量?
答案 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的一些非浏览器使用。