在chrome / safari中捕获无限循环

时间:2013-03-24 06:35:05

标签: javascript google-chrome safari while-loop

我编写了一个函数,用于在指定时间内运行后捕获循环。

var t1 = new Date().getTime();
while(true){
    //general code in here...

    document.body.appendChild(document.createElement('div')); //This causes the problem

    if(isInfinite(t1,3000)){
        alert('Loop stopped after 3 seconds')
        break;
    }       
}


function isInfinite(t1,timeLimit){
    var t2 = new Date().getTime();
    if(t2-t1> timeLimit){
        return true;
    }
    else return false;
}

它按预期工作,但是当我尝试将节点附加到文档时,它无法捕获chrome&苹果浏览器。 当我运行调试器时,它有什么奇怪的效果,它可以在FF中运行。造成这种情况的原因是什么?

1 个答案:

答案 0 :(得分:0)

也许你在DOM准备好之前解雇这个JS代码。这是我的实施。

<!--Basically I am firing this script with onload event function.-->
<html>
    <head></head>
    <body onload="init()">
        <script>
            function init() {
                alert("asg");
                var t1 = new Date().getTime();
                while(true) {
                    //general code in here...
                    document.body.appendChild(document.createElement('div')); //This causes the problem
                    if(isInfinite(t1, 3000)) {
                        alert('Loop stopped after 3 seconds')
                        break;
                    }
                }

                function isInfinite(t1, timeLimit) {
                    var t2 = new Date().getTime();
                    if(t2 - t1 > timeLimit) {
                        return truite;
                    } else return false;
                }
            }
        </script>
    </body>
</html>

但是,这个脚本很可能会崩溃,具体取决于浏览器制造商如何设置循环限制(这通常发生在主线程被阻止时)。所以我认为在这个例子中使用setTimeout函数要好得多。


仅为了您的兴趣

Javascript是基于事件的,它只有1个线程。你已经提到过你要向初学者展示它。为什么不解释它们基于事件的JS性质而不是这样做呢?