首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript中奇怪的for循环行为

Javascript中奇怪的for循环行为
EN

Stack Overflow用户
提问于 2012-08-22 17:48:15
回答 2查看 124关注 0票数 1

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

代码语言:javascript
运行
复制
var selectHTML = "";
for (var i = 0; i< arr.length; i++) {
    selectHTML += '<option value="' + arr[i].id + '">' + arr[i].name + '</option>';
} 

Next循环像我预期的那样,只尝试执行他的body两次:

代码语言:javascript
运行
复制
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中测试)?

更新:很抱歉计数器递增后的分号,这是一个打字错误。但是,如果没有它,代码仍然不能工作。

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

代码语言:javascript
运行
复制
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。顺便说一句,我添加了一个注释,body执行了2次,而不是放置"alert(i)“。魔法..。

EN

回答 2

Stack Overflow用户

发布于 2012-08-22 17:55:39

在循环中有一个额外的分号

代码语言:javascript
运行
复制
for (var i = 0; i< arr.length; i++;) {

试一下,不要这样:

代码语言:javascript
运行
复制
for (var i = 0; i< arr.length; i++) {

这对我来说工作得很好(在Firefox 14.0.1中测试):

代码语言:javascript
运行
复制
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);

返回

代码语言:javascript
运行
复制
<option value="1">test2</option><option value="2">test2</option>
<option value="1">test2</option><option value="2">test2</option>
票数 0
EN

Stack Overflow用户

发布于 2012-08-22 19:10:48

请详细说明你所说的身体跑三次是什么意思。如果您的数组只包含2个元素,当为i == 2时,arr[i]undefined,因此访问idname将抛出错误。

如果这是正在发生的事情,那么在循环中的某个点上,数组的长度正在被修改,有/没有添加元素。

通过添加alert修复的问题通常是计时问题。请参阅Alerts上的这一部分

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

它们是同步的,因为启动对话的脚本被挂起,直到对话关闭。脚本等待-function()警报返回,然后再继续。

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

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

您尚未显示修改arr变量的代码。您很有可能有一个ajax调用,其中某个地方修改了arr。在第一个代码示例中没有任何警告,因此可能整个for循环在ajax成功处理程序触发之前就结束了。在第二个示例中,警报会阻止执行for循环,直到您放弃警报为止。在丢弃它所花费的时间内,ajax成功处理程序一定已经触发。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12070468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档