我遇到了一个有趣的问题,我试图从infite循环中调用一个函数(它的体内有一个setTimeout ),它从来没有被调用过,但是当循环被转换成not时,调用就发生了!!
此工作:-
var bar = function() {
setTimeout(function() {
console.log("1");
}, 0);
};
var count = 4;
while(count > 0){
bar();
count --;
}
这从来不管用。*-
var bar = function() {
setTimeout(function() {
console.log("1");
}, 1000);
};
while (true) {
bar();
}
有人能解释这里面发生了什么吗?如何从无限循环调用具有setTimeout的函数?
发布于 2018-12-10 03:28:56
这是因为事件循环的工作方式。异步事件(如超时)将排队,并在脚本运行到完成的主体之后进行处理。这意味着它正在等待您的while循环完成,然后它才会开始查看setTimeout回调。这是您不想用长时间运行的同步代码阻止线程的原因之一,比如javascript中的巨型循环。当无限的while循环正在旋转时,什么也不会发生。
发布于 2018-12-10 03:53:09
让我们先看看这个(无限)代码是如何执行的
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的函数,那么您可以使用这样的方法,
var bar = function() {
setTimeout(function() {
console.log("1");
runBar();
}, 1000);
};
function runBar() {
bar();
}
runBar();发布于 2018-12-10 03:53:44
因为您的JavaScript代码是单线程的。无限的while循环使浏览器保持忙碌,没有时间执行其他异步函数,包括您的bar函数。
https://stackoverflow.com/questions/53699094
复制相似问题