Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中奇怪的for循环行为_Javascript - Fatal编程技术网

Javascript中奇怪的for循环行为

Javascript中奇怪的for循环行为,javascript,Javascript,我还有一个问题:arr只有两个元素。下一个循环尝试执行他的身体3次: var selectHTML = ""; for (var i = 0; i< arr.length; i++) { selectHTML += '<option value="' + arr[i].id + '">' + arr[i].name + '</option>'; } var selectHTML=”“; 对于(变量i=0;i

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

var selectHTML = "";
for (var i = 0; i< arr.length; i++) {
    selectHTML += '<option value="' + arr[i].id + '">' + arr[i].name + '</option>';
} 
var selectHTML=”“;
对于(变量i=0;i
下一个循环尝试执行他的身体只有我预期的2次:

var selectHTML = "";
for (var i = 0; i< arr.length; i++) {
    alert(i);
    selectHTML += '<option value="' + arr[i].id + '">' + arr[i].name + '</option>';
} 
var selectHTML=”“;
对于(变量i=0;i
为什么(在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>';
var selectHTML=”“;
timeSheet.steps=[{name:“保持原样”,id:-1},{name:“已批准”,id:2}];
对于(变量计数器=0;计数器
}


在Firebug中,我可以看到timeSheet.steps.length等于2。顺便说一下,我没有放置“alert(i)”,而是添加了一条注释,body执行了2次。神奇…

循环中有一个额外的分号

for (var i = 0; i< arr.length; i++;) {
for(变量i=0;i
请不要尝试:

for (var i = 0; i< arr.length; i++) {
for(变量i=0;i
这对我来说很好(在Firefox 14.0.1中测试):

var arr=[{id:1,名称:'test2'},{id:2,名称:'test2'}];
var selectHTML=“”;
对于(变量i=0;i
返回

<option value="1">test2</option><option value="2">test2</option>
<option value="1">test2</option><option value="2">test2</option>
test2test2
测试2测试2

请详细说明运行三次的主体是什么意思。如果数组只包含2个元素,当
i==2
时,
arr[i]
未定义的
,因此访问
id
name
将抛出错误

如果是这样的话,那么在循环的某个点上,数组的长度会被修改,添加/不添加元素

通过添加
警报
修复的问题通常是时间问题。请参阅上的本节

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

它们是同步的,因为启动 对话框被挂起,直到对话框关闭。脚本等待 alert()-函数在继续之前返回

棘手的是,有些浏览器允许调度事件 当对话框可见并等待某些用户操作时。此 意味着当一个脚本挂起时,等待警报 函数返回时,另一个函数可能作为 不同的事件调度

用户界面事件(如鼠标点击和单击)在启动过程中不会触发 警报,因为警报是模态的并捕获所有用户输入,但是 非用户启动的事件,如页面加载、超时处理程序和 异步XMLHttpRequest返回处理程序,可能会触发。

您没有显示修改
arr
变量的代码。您可能在修改
arr
的某些地方有一个ajax调用。在第一个代码示例中没有警报,因此可能整个for循环在ajax成功处理程序启动之前结束。在第二个示例中,警报阻止for循环执行ti您将丢弃警报。在您丢弃警报所花的时间内,ajax成功处理程序一定已启动


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

我怀疑。for循环不正确(I++后面的分号过多)。代码根本不会运行。在
i++
之后松开
-这可能不是导致错误的原因,但仍然是错误的。向我们展示
arr
的代码。您是在同一位置执行这两个循环还是
arr
在某个地方更改了?我在Chrome和Firefox中都发现了此代码的语法错误。向我们展示整个代码t嗯。你能构建一个产生那个错误的程序吗?我更新了我的示例,并在你的浏览器版本中测试了它。对我来说仍然很好。你能发布更多的代码吗?“body运行三次”意味着在Firebug中,我可以看到body运行三次而不是一次。“当I==2时,arr[I]未定义,因此访问id和name将抛出一个错误。”-是的,有一个错误。所以我问为什么循环体执行3次而不是2次,我理解这很奇怪。正如我所解释的,计时问题是一个很难调试的问题。
时间表。步骤是否被任何其他函数修改?比如settimeout/setinterval或ajax成功?不,它们不是。顺便说一下,它们不是放置“alert(i)”我添加了一条注释,正文执行了2次。Magic…一条注释?如
//这是一条注释
注释?…我想不出任何其他原因为什么您的第一个代码示例无法工作,或者为什么第二个代码示例可以使用注释:(
<option value="1">test2</option><option value="2">test2</option>
<option value="1">test2</option><option value="2">test2</option>