简单的HTML5-JS页面冻结,DT没有响应

时间:2016-10-07 12:57:04

标签: javascript html5 canvas

Here是我的HTML文件,用于模拟3球。当我运行它时,页面冻结。 Chrome DevTools不接受任何命令。是否有一个我错过的无限循环?

3 个答案:

答案 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循环,而在于外循环。它没有退出条件。