【发布时间】:2019-10-09 17:29:28
【问题描述】:
在从“You Don't Know JS”学习异步和性能时,我尝试了这个小代码 sn-p:
var t = [];
var c = 1;
function foo() {
t.push((performance.now()).toString());
if (c < 50) {
setTimeout(foo, 0);
c++;
}
}
最初几次浏览器(我使用的是 chrome)调用 foo 的时间少于 4ms。后来它只花了一点点时间4ms。
.
我想问,尽管在创建任务时是 setTimeout(),为什么它在前 3-4 次表现得像微任务?
请帮帮我, 谢谢。
【问题讨论】:
-
“微任务”是什么意思?事实上,我一般不太明白你的问题。您只是在运行一个异步函数,它将在下一个事件周期中执行。
-
时间差的小可能有多种原因,因为JS是在浏览器中执行的,浏览器自己完成的所有操作、后台调用、缓存等都会影响结果。
-
在 javascript 微任务中是在不到 4ms 的时间内执行的任务,而不是进入下一个事件周期。例如promise.then() 是微任务。
-
微任务是一个概念,它们不依赖于特定的执行时间长度(即仅仅因为它低于 4 毫秒并不使其成为微任务)。具体来说,微任务是属于作业队列而不是常规调用堆栈的任何内容:flaviocopes.com/javascript-event-loop/#es6-job-queue
-
如果您使用
setTimeout(fn, 0)来避免堆栈溢出,请参阅this Q&A。
标签: javascript performance asynchronous settimeout performance-testing