JavaScript 的“for-in”循环中是“var”还是没有“var”?

IT技术 javascript syntax for-in-loop
2021-01-27 14:16:42

for-in在 JavaScript 中编写循环的正确方法是什么?浏览器不会对我在这里展示的两种方法中的任何一种提出投诉。首先,有x一种显式声明迭代变量的方法

for (var x in set) {
    ...
}

或者,这种方法读起来更自然,但对我来说似乎不正确:

for (x in set) {
    ...
}
6个回答

使用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

JavaScript 范围和提升

不回答问题,这是正常的 for 循环,不是 for in。
2021-03-17 14:16:42
另一个重要方面是严格模式禁止隐式创建全局属性,因此使用标准的“for in”循环没有 var 语句实际上会失败并返回一个 ReferenceError。
2021-03-21 14:16:42
如果在一个范围内碰巧有多个 for 循环怎么办?您要么必须重用索引(无变量),要么必须声明许多将永远不会再使用的新变量(j、k、l、m...)。
2021-04-01 14:16:42
但是,来自 Java,将head放在var内部for看起来像是在 for 循环中是本地的,但事实并非如此。因此,我更喜欢下面 user422039 的样式。
2021-04-02 14:16:42
i==5 的原因不是因为提升而不是 for 循环中缺少 var 吗?
2021-04-04 14:16:42

第一个版本:

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在中隐式声明)如果不使用xvar),则两个版本将相同。

最后一个完整的答案,解释和很好的例子。它确实回答了这个问题。
2021-03-23 14:16:42

你真的应该用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 原型中。

.forEach()在区分 Object for/in 循环与 Array for/length 循环方面,最好让您更清楚地使用Array方法。
2021-03-25 14:16:42

实际上,如果您不喜欢for标题中的声明,您可以这样做:

var x;
for (x in set) {
    ...
}

正如在这个问题的其他答案中提到的,根本不使用var会产生不必要的副作用,比如分配全局属性。

使用您用var. 隐式声明的变量具有不同的范围,这可能不是您想要的。