Javascript 一个函数正在执行无限循环,其他函数可以';不可用 标题 开始 停止 函数start(){ 虽然(正确){ console.log(“开始”) } } 函数停止(){ 控制台日志(“停止”) }

Javascript 一个函数正在执行无限循环,其他函数可以';不可用 标题 开始 停止 函数start(){ 虽然(正确){ console.log(“开始”) } } 函数停止(){ 控制台日志(“停止”) },javascript,Javascript,当我单击“开始”进入无限循环时,当我单击“停止”时,停止将不会被打印,它被阻止。浏览器Javascript默认情况下一次只允许执行一个脚本。解决此问题的最简单方法是使用异步代码-例如,假设您希望每秒打印一条消息,直到单击停止按钮: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title&

当我单击“开始”进入无限循环时,当我单击“停止”时,停止将不会被打印,它被阻止。

浏览器Javascript默认情况下一次只允许执行一个脚本。解决此问题的最简单方法是使用异步代码-例如,假设您希望每秒打印一条消息,直到单击停止按钮:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button onclick="start()">start</button>
<button onclick="stop()">stop</button>
</body>
<script>
    
    function start() {
        while(true){ 
             console.log("start")
        }
    }
    function stop() {
        console.log("stop")
    }

</script>
</html>

使用while循环时,浏览器将被阻止,直到循环结束。最好改用setInterval。

问题在于如何执行javascript。基本上,与您的网站相关的所有内容都在一个线程中执行(注意:这并不完全正确,但它对我们有效),因此当您有一个阻止javascript脚本(如while循环)时,它会冻结整个网站。
如果现在按下停止按钮,它将不会执行,因为while循环仍在冻结页面。

解决方案: 改为使用setInterval,如下所示:

function start() {
  if (backgroundTask) return;

  console.log("start");
  backgroundTask = setTimeout(function () { console.log("Hi!"); }, 1000);
}

function stop() {
  if (!backgroundTask) return;

  clearTimeout(backgroundTask);
  backgroundTask = null;
}
var interval\u handle=未定义//{//循环的函数
控制台日志(“启动”);
}
,1); 每1ms循环一次;
}
函数停止(){
stopMyInterval();
控制台日志(“停止”)
}
/*停止间歇*/
函数stopMyInterval(){
if(间隔\u句柄!=未定义){
clearInterval(间隔\手柄);
间隔_句柄=未定义;
}
}
如果您这样使用它,javascript会在完成站点运行所需的所有其他操作(如按钮事件)后,每隔1毫秒自动将函数排队。
文档:

如果将变量传递给while循环,它将在进程中保持运行,直到它保持真实。如果在有限范围值/数组上使用它,这很好。或者你需要通过休息;在while循环中。您可以将setInterval分配给
变量
,在该变量中,您可以调用
clearInterval(variable)
,一旦您想要停止进程


标题
开始
停止
var回路
函数start(){
循环=设置间隔(()=>
console.log(“开始”)
)
}
函数停止(){
控制台日志(“停止”)
清除间隔(循环)
}

不要引入无限循环,只需记录“开始”。或者您真的想记录“开始”直到单击“停止”按钮吗?请改用
setInterval
,或者
requestAnimationFrame
如果您想要非阻塞loop@ChrisGJavaScript是单线程的,setInterval也会被阻止,我试着回答你的问题?我知道,我的意思是“不要使用while循环”。
    var interval_handle = undefined; //<- id of your interval. Used to stop it again
    function start() {
        stopMayInterval(); // Stop the loop, if already running
        interval_handle = setInterval( // Start the loop
          ()=>{ // Function that is looped
            console.log("start");
          }
        ,1); looped every 1 ms;
    }
    function stop() {
        stopMyInterval();
        console.log("stop")
    }

    /* Stops the Interval */
    function stopMyInterval(){
      if(interval_handle != undefined){
        clearInterval(interval_handle);
        interval_handle = undefined;
      }
    }