Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.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 在chrome/safari中捕捉无限while循环_Javascript_Google Chrome_Safari_While Loop - Fatal编程技术网

Javascript 在chrome/safari中捕捉无限while循环

Javascript 在chrome/safari中捕捉无限while循环,javascript,google-chrome,safari,while-loop,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 a

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

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&safari中捕获。
奇怪的是,当我运行调试器时,它就工作了,而且它在FF中工作。这是什么原因造成的?

可能是您在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>

函数init(){
警报(“asg”);
var t1=new Date().getTime();
while(true){
//这里的通用代码。。。
document.body.appendChild(document.createElement('div'));//这会导致问题
if(isInfinite(t1,3000)){
警报('循环在3秒后停止')
打破
}
}
函数isInfinite(t1,时间限制){
var t2=新日期().getTime();
如果(t2-t1>时间限制){
返矿;
}否则返回false;
}
}
然而,这个脚本很可能会崩溃,这取决于浏览器制造商对循环设置的限制(这通常发生在主线程被阻塞时)。所以我认为在这个例子中使用setTimeout函数更好


只是为了你的利益
Javascript是基于事件的,它只有一个线程。你提到你将向初学者展示它。为什么不向他们解释JS基于事件的本质而不是这样做呢?

你需要让处理器喘口气。使用setTimeout,而不是在紧密循环中创建元素和Dom操作是的,我通常不会这样做,这一部分将是我为初学者创建的工具的一部分,他们可能会这样做。所以我仍然需要它来捕获。@mplungjan任何无限while循环都会杀死处理器,这正是我试图解决的问题,所以你的建议放错了地方。当最终结果是:不要这样做时,它怎么会放错地方呢。你可以通过几种方式使浏览器崩溃,所以学习不崩溃可能是需要的教训?到这里,在while(true){}中复制,你就会明白我在说什么。当然,用户不应该这样做,但偶尔会发生错误。为什么不给他们一个有用的提醒,而不是让整个浏览器崩溃呢?这仍然不能抓住它。我最好奇的是,为什么它在调试时捕获,而在运行时却没有捕获。我只想让它捕捉到,不管循环中放了什么。