for-in
在 JavaScript 中编写循环的正确方法是什么?浏览器不会对我在这里展示的两种方法中的任何一种提出投诉。首先,有x
一种显式声明迭代变量的方法:
for (var x in set) {
...
}
或者,这种方法读起来更自然,但对我来说似乎不正确:
for (x in set) {
...
}
for-in
在 JavaScript 中编写循环的正确方法是什么?浏览器不会对我在这里展示的两种方法中的任何一种提出投诉。首先,有x
一种显式声明迭代变量的方法:
for (var x in set) {
...
}
或者,这种方法读起来更自然,但对我来说似乎不正确:
for (x in set) {
...
}
使用var
,它会缩小变量的范围,否则变量会查找最近的闭包来搜索var
语句。如果它找不到 avar
那么它是全局的(如果您处于严格模式using strict
,则全局变量会抛出错误)。这可能会导致如下问题。
function f (){
for (i=0; i<5; i++);
}
var i = 2;
f ();
alert (i); //i == 5. i should be 2
如果您var i
在 for 循环中写入警报,则会显示2
。
第一个版本:
for (var x in set) {
...
}
声明了一个名为 的局部变量x
。第二个版本:
for (x in set) {
...
}
才不是。
如果x
已经是一个局部变量(即您在当前范围内的某个地方(即当前函数)中有一个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
, there
, hey
, there
, there
。你不想那样!var x
在您的for
循环中使用。
最重要的for
是:如果循环在全局作用域中(即不在函数中),则局部作用域(x
如果使用var x
则在中声明作用域)与全局作用域相同(作用域x
在中隐式声明)如果不使用x
var),则两个版本将相同。
你真的应该用var
, always声明局部变量。
您也不应该使用“for ... in”循环,除非您绝对确定这是您想要做的。为了迭代真实数组(这很常见),您应该始终使用带有数字索引的循环:
for (var i = 0; i < array.length; ++i) {
var element = array[i];
// ...
}
使用“for ... in”遍历普通数组可能会产生意想不到的后果,因为您的循环可能会选择除数字索引之外的数组属性。
编辑- 在 2015 年,它也可以用于.forEach()
遍历数组:
array.forEach(function(arrayElement, index, array) {
// first parameter is an element of the array
// second parameter is the index of the element in the array
// third parameter is the array itself
...
});
.forEach()
从 IE9 开始,该方法存在于 Array 原型中。
实际上,如果您不喜欢for
标题中的声明,您可以这样做:
var x;
for (x in set) {
...
}
正如在这个问题的其他答案中提到的,根本不使用var
会产生不必要的副作用,比如分配全局属性。
使用您用var
. 隐式声明的变量具有不同的范围,这可能不是您想要的。