取消JavaScript中的无限循环

取消JavaScript中的无限循环,javascript,settimeout,Javascript,Settimeout,我试图超时一个函数,以防它有一个无限循环。但下面的方法不起作用。知道为什么以及如何修复它吗 setTimeout(clearValues,1000); function clearValues(){ i=0; alert("hi "+i); } i=19 function infin(){ while(i>0){ console.log(i); i++; } alert("Done"); } infin();

我试图超时一个函数,以防它有一个无限循环。但下面的方法不起作用。知道为什么以及如何修复它吗

setTimeout(clearValues,1000);

function clearValues(){
    i=0;
    alert("hi "+i);
}

i=19
function infin(){
    while(i>0){
        console.log(i);
        i++;
    }
    alert("Done");
}

infin();
在下面的例子中,我显示了警报(比预期的晚了一点),即使在警报之后,控制台语句也会继续打印。这意味着在本例中,setTimeout没有等待循环结束。对此有何解释

setTimeout(clearValues,500);

function clearValues(){
    alert("clear");
}


function infin(){
for(i=0;i<10000;){
    i=i+0.3;
    console.log(i);
}
}

infin();
setTimeout(clearValues,500);
函数clearValues(){
警报(“清除”);
}
函数infin(){

for(i=0;i
setTimeout
异步工作,意味着它将在1000ms和上一个事件循环完成后运行。由于while循环永远不会完成,因此将永远不会调用回调


如果要退出循环,请向循环中添加条件。

另一种解决方案可能是使用间隔:

var code = function(){ 
              console.log('tick'); 
           };
var clock = setInterval(code, 200);
当您不再需要它时:

clearInterval(clock);

当您使用稍微不同的更改进行
infin
调用时,它会起作用。
var i=0;
设置超时(clearValues,1000);
var interval=setInterval(infin,0);
函数clearValues(){
退出(“清除”);
间隔时间;
}
函数infin(){
如果(i<10000){//如果你是舒尔,你
i++;
输出(i);
}否则{//永远不会达到极限,
clearInterval(interval);//您可以删除四个
}//注释行
}
功能输出(s、pre){
var descriptionNode=document.createElement('div');
如果(预){
var preNode=document.createElement('pre');
preNode.innerHTML=s+'
'; descriptionNode.appendChild(preNode); }否则{ descriptionNode.innerHTML=s+'
'; } document.getElementById('out').appendChild(descriptionNode); }

您调用这些函数的操作是什么?没有特定的操作。这只是作为脚本运行。第二个示例只有在循环完成后才起作用。OP使用的是
设置超时
而不是
设置间隔
对不起,但是OP代表什么?是询问question@JeanF.OP-原始后代可能要做什么如果你在不同的浏览器中测试它,你可能会得到不同的结果。