首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在无限while循环中调用setTimeout时不调用

为什么在无限while循环中调用setTimeout时不调用
EN

Stack Overflow用户
提问于 2018-12-10 03:25:39
回答 5查看 109关注 0票数 2

我遇到了一个有趣的问题,我试图从infite循环中调用一个函数(它的体内有一个setTimeout ),它从来没有被调用过,但是当循环被转换成not时,调用就发生了!!

此工作:-

代码语言:javascript
复制
var bar = function() {
    setTimeout(function() {
        console.log("1");
    }, 0);
};

var count = 4;
while(count > 0){
  bar();
  count --;
}

这从来不管用。*-

代码语言:javascript
复制
var bar = function() {
  setTimeout(function() {
    console.log("1");
  }, 1000);
};

while (true) {
  bar();
}

有人能解释这里面发生了什么吗?如何从无限循环调用具有setTimeout的函数?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-12-10 03:28:56

这是因为事件循环的工作方式。异步事件(如超时)将排队,并在脚本运行到完成的主体之后进行处理。这意味着它正在等待您的while循环完成,然后它才会开始查看setTimeout回调。这是您不想用长时间运行的同步代码阻止线程的原因之一,比如javascript中的巨型循环。当无限的while循环正在旋转时,什么也不会发生。

票数 7
EN

Stack Overflow用户

发布于 2018-12-10 03:53:09

让我们先看看这个(无限)代码是如何执行的

代码语言:javascript
复制
CURRENT EXECUTION                               WAITING FOR EXECUTION (IN QUEUE)
===================                             ================================

=> variable bar is assigned to a function
=> while (true)
=> call bar()
=> inside bar()
=> setTimeout function will be sent to queue    => Execute setTimeout’s function after 1000ms(1)
=> while (true)                         
=> call bar()                           
=> inside bar()                         
=> setTimeout function will be sent to queue    => Execute setTimeout’s function after 1000ms(2)
=> call bar()                           
=> inside bar()                         
=> setTimeout function will be sent to queue    => Execute setTimeout’s function after 1000ms(3)
.
.
. while (true) => happens forever           => waits forever…

如果您想在无限循环中调用一个带有setTimeout的函数,那么您可以使用这样的方法,

代码语言:javascript
复制
var bar = function() {
    setTimeout(function() {
        console.log("1");
        runBar();
   }, 1000);
};

function runBar() {
    bar();
}
runBar();
票数 1
EN

Stack Overflow用户

发布于 2018-12-10 03:53:44

因为您的JavaScript代码是单线程的。无限的while循环使浏览器保持忙碌,没有时间执行其他异步函数,包括您的bar函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53699094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档