【发布时间】:2013-08-20 16:05:38
【问题描述】:
在尝试回答 this question 时,我遇到了一个奇怪的行为(这不一样:他的迭代太少,我的迭代太多):
HTML:
<button id="go">it will be legend...</button>
<div id="output"></div>
JS:
var output = document.getElementById('output');
document.getElementById('go').onclick = function() {
output.textContent += 'wait for it...';
for (var i=0; i<3000000000; i++) {
var unused = i; // don't really care
}
output.textContent += ' dary!';
};
循环需要几秒钟的时间来执行,因为它有 3,000,000,000 次迭代。
单击按钮后,我的预期是:
-
wait for it...出现 - 由于循环,进程有点冻结
-
dary!出现
实际发生了什么:
- 由于循环,进程有点冻结
-
wait for it... dary!一起出现
知道为什么会有这样的行为吗?
自行查看:fiddle。
【问题讨论】:
-
它在所有浏览器中的行为都是这样吗?如果您设置一个小的超时时间,则可以正常工作
-
我看到了小提琴,这真的很奇怪......我认为
looping是一个普通的过程! -
浏览器还优化了对 DOM/CSS 的更改,以便仅在必要时执行它们(以避免多次连续重排)。
-
我的猜测是设置 textContent 是异步的,当浏览器尝试显示文本时,30 亿循环正在冻结浏览器,因此在完成之前您不会看到任何更新,但是通过完成的时间再次设置文本。这是与超时相同的小提琴jsfiddle.net/2MrD8/2
标签: javascript loops execution-time