我有关于堆栈和setTimeout 0的问题。 上面的代码产生了所需的输出,但我不明白为什么不设置超时为0“....计算”不输出。 因为我认为即使没有超时,堆栈上的“....计算”然后转到函数countUp和for循环,如果这样就完成了那么就会写“准备再次计算” 但是如果没有setTimeout 0,为什么不这样呢?
function countUp() {
var result;
for (var i = 0; i < 1000000000; i++) {
result = i;
}
document.getElementById('status').innerText = 'Ready To Calculate Again';
}
function callback() {
document.getElementById('status').innerText = '...calculating';
var wait = window.setTimeout(function() {
countUp();
}, 0);
}
document.getElementById('button').addEventListener('click', callback);
答案 0 :(得分:0)
浏览器会在事件队列中的任务之间进行重排和重绘 如果你在没有setTimeout的情况下调用countUp,那么将在回调任务的范围内调用countUp,因此在countUp完成后将在浏览器中重绘。 所以你会得到......计算&#39;并且准备再次计算&#39;立刻。 但它们应该在不同的时刻显示出来。因此,要允许浏览器重绘并显示...计算我们将事件队列中的countUp调用作为setTimeout的单独任务。