Javascript中奇怪的for循环行为

时间:2012-08-22 09:48:15

标签: javascript

我有下一个问题:arr只有两个元素。下一个循环试图执行他的身体3次:

var selectHTML = "";
for (var i = 0; i< arr.length; i++) {
    selectHTML += '<option value="' + arr[i].id + '">' + arr[i].name + '</option>';
} 

下一个循环试图按照我的预期执行他的身体2次:

var selectHTML = "";
for (var i = 0; i< arr.length; i++) {
    alert(i);
    selectHTML += '<option value="' + arr[i].id + '">' + arr[i].name + '</option>';
} 

为什么(在Firefox 14.0.1中测试过)?

更新:抱歉计数器增加后的分号,这是一个错字。但是如果没有它,代码仍然无效。

更新:好的,这段代码已经简化了。整个代码本身:

var selectHTML = "";
timeSheet.steps = [ { name:"Leave as is", id:-1}, { name:"Approved", id:2} ];
for (var counter = 0; counter < timeSheet.steps.length; counter++) {
    selectHTML += '<option value="' + timeSheet.steps[counter].id + '">' + timeSheet.steps[counter].name + '</option>';

}

在Firebug中,我可以看到timeSheet.steps.length等于2.顺便说一下,我没有添加“alert(i)”,而是添加了注释,并且正文执行了2次。魔法...

2 个答案:

答案 0 :(得分:0)

循环中有一个额外的分号

for (var i = 0; i< arr.length; i++;) {

不用尝试:

for (var i = 0; i< arr.length; i++) {

这适用于我(在Firefox 14.0.1中测试):

var arr = [{id:1, name: 'test2'}, {id:2, name: 'test2'}];
var selectHTML = "";
for (var i = 0; i< arr.length; i++) {
    selectHTML += '<option value="' + arr[i].id + '">' + arr[i].name + '</option>';
}
console.log(selectHTML);
var selectHTML = "";
for (var i = 0; i< arr.length; i++) {
    selectHTML += '<option value="' + arr[i].id + '">' + arr[i].name + '</option>';
}
console.log(selectHTML);

返回

<option value="1">test2</option><option value="2">test2</option>
<option value="1">test2</option><option value="2">test2</option>

答案 1 :(得分:0)

请详细说明你的身体跑三次的意思。如果您的数组仅包含2个元素,则i == 2时,arr[i]undefined,因此访问idname会引发错误。

如果发生了这种情况,那么在循环中的某个时刻,正在修改数组的长度,使用/不添加元素。

通过添加alert修复的问题通常是时间问题。请参阅Alerts

上的此部分
  

警报框(以及相关的确认和提示框)有一些   奇怪的属性。

     

它们是启动的脚本意义上的同步   对话框暂停,直到对话框关闭。脚本等待   alert() - 在继续之前返回的函数。

     

棘手的部分是某些浏览器允许调度事件   对话框可见并等待某些用户操作。这个   表示暂停一个脚本时,等待警报   函数返回,另一个函数可能作为一部分执行   不同的事件派遣。

     

用户界面事件(如mouseup和click)在播放期间不会触发   警报,因为警报是模态的并且捕获所有用户输入,但是   非用户启动的事件,如页面加载,超时处理程序和   异步XMLHttpRequest返回处理程序,可能会触发。

您尚未显示修改arr变量的代码。有可能你在修改arr的地方有一个ajax调用。在第一个代码示例中没有警报,因此可能在ajax成功处理程序触发之前整个for循环结束。在第二个示例中,警报会阻止for循环执行,直到您丢弃警报。在你丢弃它的时候,ajax成功处理程序必须被解雇。

请分享修改arr变量的所有相关代码。