在我深入探讨这个问题之前。让我声明一下,事件循环指的是http://en.wikipedia.org/wiki/Event_loop。这是浏览器实现的。有关更多信息,请阅读:http: //javascript.info/tutorial/further-javascript-features/events-and-timing-depth。
这个问题又难又长,所以请尽量忍耐!我非常感谢所有答案!
所以。现在,据我了解,在 JavaScript 中只有一个主线程(即在大多数浏览器环境中)。所以,像这样的代码:
for (var color = 0x000; color < 0xfff; color++) {
$('div').css('background-color', color.toString(16));
}
将产生一个从黑色到白色的动画,但您不会看到,因为渲染是在处理完代码之后完成的(当下一个滴答发生时——浏览器进入事件循环)。
如果你想看动画,你可以这样做:
for (var color = 0x000; color < 0xfff; color++) {
setTimeout(function() {
$('div').css('background-color', color.toString(16));
}, 0);
}
上面的例子会产生一个可见的动画,因为 setTimeout 将一个新事件推送到浏览器事件循环堆栈,它将在没有任何运行后处理(它进入事件循环以查看下一步该做什么)。
在这种情况下,浏览器似乎将 0xfff (4095) 事件推入堆栈,其中每个事件都在它们之间通过渲染过程进行处理。所以,我的第一个问题(#1)是渲染到底是什么时候发生的?它是否总是发生在事件循环堆栈中两个事件的处理之间?
第二个问题是关于我给你的 javascript.info 网站链接中的代码。
...
function func() {
timer = setTimeout(func, 0)
div.style.backgroundColor = '#'+i.toString(16)
if (i++ == 0xFFFFFF) stop()
}
timer = setTimeout(func, 0)
....
我的问题是浏览器是否会在每次到达div.style. ... = ...
线路时将新的“渲染”事件推送到事件循环堆栈?但是由于 setTimeout 调用,它不会首先推送事件吗?那么,浏览器是否最终出现在一个堆栈中,例如:
setTimeout event
render event
由于 setTimeout 调用是在 div 样式更改之前处理的?如果这就是堆栈的样子,那么我会假设下次浏览器进入事件循环时,它将处理 setTimeout 的回调并最终得到:
rendering event
setTimeout event
rendering event
并继续之前的 setTimeout 调用产生的渲染事件?