Here是我的HTML文件,用于模拟3球。当我运行它时,页面冻结。 Chrome DevTools不接受任何命令。是否有一个我错过的无限循环?
答案 0 :(得分:1)
我无法在评论中发布此内容,但您是否已对此进行了检查?你有两个while循环,一个是嵌套的...我可能错了,代码很难遵循。
更新(感谢Brian澄清):
在内部循环中,将isClose与某些计算(未完成赋值)进行比较,如果求值为true则退出内部循环。在此条件之后,不对isClose或第一个条件中的任何变量执行任何赋值。因此,如果内循环在第一次传递时没有退出,它将永远不会:)
while (true) {
isClose = !isClose;
p0 = project(obj.vertices[ obj.faces[f][v-1] ]);
p1 = project(obj.vertices[ obj.faces[f][ v ] ]);
factor = (5000 - p1[0] - p1[1]) / (p1[0] + p1[1] - p0[0] - p0[1]);
p01 = [p1[0] + factor * (p1[0] - p0[0]), p1[1] + factor * (p1[1] - p0[1])];
polygon = [p01, p1];
while (true) {
v++;
if (isClose != obj.vertices[ obj.faces[f][v % obj.faces[f].length] ][2] > -Math.PI/2)
break;
polygon[polygon.length] = project(obj.vertices[ obj.faces[f][v % obj.faces[f].length] ]);
}
p0 = project(obj.vertices[ obj.faces[f][ v % obj.faces[f].length] ]);
p1 = project(obj.vertices[ obj.faces[f][(v-1) % obj.faces[f].length] ]);
factor = (5000 - p1[0] - p1[1]) / (p1[0] + p1[1] - p0[0] - p0[1]);
p01 = p1 + factor * (p1 - p0);
polygon[polygon.length] = p01;
if (is_clockwise(polygon)) {
p1 = polygon[ 0 ];
pN = polygon[polygon.length - 1];
factor = 5000 / (p1[0] + pN[0] + p1[1] + pN[1]);
p0 = [factor * (p1[0] + pN[0]), factor * (p1[1] + pN[1])];
polygon[polygon.length] = p0;
draw(polygon, obj.colour);
}
}
答案 1 :(得分:1)
每个javascript程序员都会不时地使用锁定的标签,并且不容易退出。
如果您打开开发工具,可以使用调试器并暂停执行,然后将变量设置为退出条件。
实施例
for(var i = 100; i >= 0; i++){ // force of habit ++ has a infinite loop
// do stuff
}
如果devtools启动,循环将不会退出。转到调试器面板,然后单击“暂停”。然后添加到观察列表i=-2
。这会将i设置为退出条件。取消暂停,循环将退出。
如果不是在devtools中,你就会被卡住,你所能做的就是关闭标签或强制它崩溃(停止过程)。要停止Chrome中的过程,请按[shift] [esc]或使用menu->More tools->Task manager
打开任务菜单。从正在运行的选项卡和应用程序列表中选择任务,然后单击End process
这将停止执行并清除选项卡(选项卡将显示“Aw,snap!”)
或者您可以等待脚本长时间阻塞时出现的弹出窗口,然后点击“kill”
javascript这样做非常令人沮丧。当使用不确定的退出条件编写和测试循环以添加额外的退出子句时,它会付出代价。
while(true){
if(someThingMayHappen === true){
break;
}
}
这可能是开发过程中的问题。事情可能永远不会发生,然后你被锁定了。作为安全措施添加故障安全
var counter = 0;
while(counter < 10000){
counter += 1;
if(someThingMayHappen === true){
break;
}
}
现在,如果有错误,您的代码仍会退出,您可以更轻松地追踪错误。一旦您对代码运行正常,就可以删除计数器。
从专业的角度来看,我永远不会接受一些在循环语句中没有退出条件的代码。 “break”和“continue”实际上是goto语句,使你的代码更难阅读。
避免while(true)
的另一个原因是它混淆了优化代码。它需要一个明确的退出条件,如果你用break
混淆退出条件,它只会放弃并标记,而不仅仅是循环,而是整个函数和相关函数为“不用于优化”,这不是一件好事。退一点Infinite loops with deep logic exit conditions or unclear exit conditions
即使您想使用中断退出,也可以通过添加假退出条件来欺骗javascript引擎。
var loop = true;
while(loop){
if(exitCondition){
loop = false; // not needed but for makes the optimiser happy.
break;
}
}
这将阻止代码被标记为“Not for optimization”
答案 2 :(得分:0)
问题不在于内部while循环,而在于外循环。它没有退出条件。