我正在Viusal Studio代码中运行一个非常基本的javascript代码。但是我没有看到回调函数被触发。
我试图了解setTimeout()在javascript中的工作方式。我正在Visual Studio代码中运行以下代码(在名为test.js的文件中),如下所示:
节点test.js
'use strict'
let timerexpired = false;
setTimeout( function() {console.log(`setting timerexpired to true...`);
timerexpired = true;
},
5000);
while(1) {
console.log(`timerexpired = `, timerexpired);
if (timerexpired) {
console.log(`timer expired. Resume execution`);
break;
} else {
console.log(`keep on spinning`);
}
}
预计循环将在5000毫秒后断开。但是它一直在旋转,输出为“继续旋转”
答案 0 :(得分:2)
调用setTimeout
或对此事进行任何阻止操作时,实际上已将其添加到事件表中,而不会立即执行。
只有在调用堆栈为空后,事件循环才检查事件表以查看是否有任何等待,并将其移至调用堆栈。
要更好地理解这一点,请检查以下示例:
setTimeout(() => console.log('first'), 0)
console.log('second')
您可能认为first
将在second
之前被记录,但实际上second
将首先被记录。
在您的示例中,调用堆栈永远不会为空,因此setTimeout
不会真正按预期工作。
您可能想检查this,它将使您对幕后发生的事情有更好的了解。
答案 1 :(得分:0)
虽然(1)是一个无限的while循环。我认为这是原因