setInterval与do-while异步执行异常及Node.js栈溢出问题咨询
关于setInterval与do-while循环的问题分析
这段代码运行时出现了和预期不符的情况:原本认为setInterval会执行并输出内容,但在Node.js中运行时不仅没有任何输出,还提示heap stack is full(栈溢出),同时对异步执行逻辑存在以下困惑:
- 最初误以为
setInterval会阻塞后续的条件检查,实际却陷入了无限循环,条件检查根本无法执行; - 按
do while的定义,它会先执行一次循环体:初始a == 3为真,所以调用setInterval(ali,1000)。但对异步函数的执行逻辑有疑问:如果异步是多线程模式,循环和setInterval应该同时执行?setInterval会暂停去运行后续语句?这似乎和do while首次迭代不检查条件、第二次才检查的定义矛盾; - 之前还错认为当
setInterval运行时,a会变为4,此时do while的条件检查会为假,循环就会停止,但实际并非如此。
代码示例
var a=3; function ali() { console.log("testing and understanding setInterval method"); a++; } do { if (a == 3) setInterval(ali,1000); } while (a == 3);
问题原因解析
JavaScript是单线程异步模型,setInterval属于宏任务,它的回调函数不会立刻执行,而是被放入任务队列,必须等待当前执行栈中的所有同步代码执行完毕后,才会被处理。
这里的do while循环是同步代码,会持续占用执行栈:因为ali函数根本没机会执行(任务队列里的宏任务轮不到运行),所以a的值始终是3,while (a == 3)的条件永远为真,循环会无限执行下去,不断向执行栈中压入循环逻辑,最终导致栈溢出。而setInterval的回调ali永远无法被触发,自然看不到任何输出。
内容的提问来源于stack exchange,提问作者mohammad ali hanfi
相关产品推荐
相关产品推荐

