我不完全理解JavaScript线程
在我深入研究这个问题之前。让我说,通过Event Loop,我指的是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将一个新事件推送到浏览器Event Loop堆栈,该堆栈将在没有任何运行后进行处理(它进入Event Loop以查看下一步该做什么)。
在这种情况下,浏览器似乎将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-call,它是否首先推送事件?那么,浏览器最终是否像堆栈一样:
setTimeout event
render event
由于在div样式更改之前处理了setTimeout调用?如果这就是堆栈的样子,那么我假设下次浏览器进入事件循环时它将处理setTimeout的回调并最终得到:
rendering event
setTimeout event
rendering event
并继续前面的setTimeout调用生成的渲染事件?
没有找到相关结果
已邀请:
2 个回复
提孺局缎
咳累录酬