1

我有一个遍历所有项目的 for 循环:

for (i=0; i < this.widgets.length; i++) {
  this.changeWidgetArray(this.widgets[i]); 
}

在 for 循环中,对于每个元素,我调用“changeWidgetArray”。在这种方法中,改变了上面的“widgets”-Array。“changeWidgetArray”中的这种数组更改是否会影响循环迭代?

我的问题是:

目前,当迭代从第一项开始时,是整个数组及其所有元素都“收集”,还是 JavaScript 在下一个迭代步骤开始之前动态地一个一个地获取。

还是这取决于 JavaScript 实现?这是在 ECMA 脚本规范中定义的吗?

非常感谢提前

4

3 回答 3

5

for (i=0; i < this.widgets.length; i++) {
  this.changeWidgetArray(); 
}

for (var i=0, max=this.widgets.length; i < max; i++) {
  this.changeWidgetArray(); 
}
于 2013-01-23T08:05:57.877 回答
2

在循环迭代期间,没有变量被缓存。(除非你自己在临时变量中这样做)

因此,每次评估时,this.widgets.length将是数组的确切长度,因为每次更改数组时都会更新 的值。widgetslength

您可以通过将长度分配给这样的临时变量来缓存长度:

for (var i=0, l = this.widgets.length; i < l; i++) {

但这可能是个坏主意,因为您正在循环中更改数组,可能会使您指向数组中的无效索引。

于 2013-01-23T08:06:19.537 回答
0

每次修改它包含的集合时,数组长度都会更新。任何时候你引用array.length,它都会反映数组的当前大小。

出于这个原因,以及许多性能优势,您应该始终这样编写代码:

for(var i = 0, l = array.length; i < l; i++){
  // Do stuff with array[l]
}

如果您这样做(假设您遍历的方向无关紧要),您还可以获得更多性能:

var l = array.length;
while(l--){
  // Do stuff with array[l]
}
于 2013-01-23T08:09:04.020 回答