用JavaScript编写for-in
循环的正确方法是什么?浏览器不会对我在这里展示的两种方法中的任何一种发出抱怨。首先,有一种方法是显式声明迭代变量x
:
for (var x in set) {
...
}
或者,这种方法读起来更自然,但在我看来并不正确:
for (x in set) {
...
}
发布于 2011-04-19 21:36:49
使用var
,它缩小了变量的作用域,否则变量将查找最近的闭包来搜索var
语句。如果它不能找到一个var
,那么它是全局的(如果你在严格模式下,using strict
,全局变量抛出一个错误)。这可能会导致如下问题。
function f (){
for (i=0; i<5; i++);
}
var i = 2;
f ();
alert (i); //i == 5. i should be 2
如果在for循环中编写var i
,则警报将显示2
。
发布于 2011-04-19 21:39:44
第一个版本:
for (var x in set) {
...
}
声明一个名为x
的局部变量。第二个版本:
for (x in set) {
...
}
不会。
如果x
已经是一个局部变量(例如,您在当前作用域(即current函数)中较早的某个位置有一个var x;
或var x = ...;
),那么它们将是等价的。如果x
还不是一个局部变量,那么使用第二个变量将隐式声明一个全局变量x
。考虑下面的代码:
var obj1 = {hey: 10, there: 15};
var obj2 = {heli: 99, copter: 10};
function loop1() {
for (x in obj1) alert(x);
}
function loop2() {
for (x in obj2) {
loop1();
alert(x);
}
}
loop2();
您可能认为这会向hey
、there
、heli
、hey
、there
、copter
发出警报,但由于x
是同一个,它将向hey
、there
、<代码>D18、<代码>D19、<代码>D20、<代码>D21发出警报。你不会想这样的!在for
循环中使用var x
。
最重要的是:如果for
循环在全局作用域中(即不在函数中),则局部作用域(如果使用var x
,则在中声明作用域x
)与全局作用域(如果使用不带x
的x
,则在中隐式声明作用域var)相同,因此两个版本将是相同的。
发布于 2011-04-19 22:01:44
实际上,如果你不喜欢在for
标题中声明,你可以这样做:
var x;
for (x in set) {
...
}
正如在对这个问题的其他回答中所提到的,根本不使用var
会产生不必要的副作用,比如分配全局属性。
https://stackoverflow.com/questions/5717126
复制相似问题