用于未初始化的局部变量的javascript变量范围
javascript variable scope for uninitialized local variables
我在理解之间的区别时遇到问题
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
总是true
,g=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的一些非浏览器用途。
- js命名空间和变量范围
- 如何确保变量范围在这个循环中得到维护
- 在两个浏览器选项卡之间共享变量范围
- 文件API中的Javascript变量范围
- javascript和jQuery的嵌套对象函数中的变量范围
- JavaScript 函数变量范围问题
- JavaScript 中变量范围的问题
- Javascript - 揭示对象和变量范围
- 主干.js(具有 Require.js)变量/范围访问问题
- Javascript 变量范围未定义
- 如何绕过javascript变量范围
- IE 8变量范围错误
- 了解 Javascript 变量范围
- 控制变量范围
- 函数之间的Javascript变量范围问题
- 这种减少if语句中声明的变量范围的模式是一种好的做法吗
- 用于未初始化的局部变量的javascript变量范围
- 变量范围
- 请求节点模块变量范围
- Javascript 和 JQuery dom 全局变量范围