如何在JavaScript中生成执行队列
How is execution queue generated in JavaScript?
考虑这个简单的例子:
console.log('Start');
setTimeout(function() {
console.log('First timeout');
}, 100);
setTimeout(function () {
console.log('Second timeout');
}, 2000);
var time = Date.now();
for (var i = 0; i < 2000000000; i++) {
var temp = i * i * Math.sqrt(i);
temp = temp + temp;
}
console.log(Date.now() - time);
setTimeout(function () {
console.log('Third timeout');
}, 50);
console.log('End');
输出为:
Start
1219
End
First timeout
Third timeout
Second timeout
是什么让我想到了执行队列(堆栈?)的生成方式。JavaScript interpreter首先检查代码,生成队列,然后开始执行,当超时时间过去时,将函数从超时添加到队列的末尾(所以我们有预生成的执行队列,它在执行过程中更新,并动态生成超时列表),我说得对吗?
JavaScript是单线程的。超时调用被推送到事件循环,因此它们在所有主流调用之后执行。
console.log('Start'); **-> Printed #1 **
setTimeout(function() {
console.log('First timeout'); **-> Pushed to eventloop #1 **
}, 100);
setTimeout(function () {
console.log('Second timeout');**-> Pushed to eventloop #3 !! **
}, 2000);
var time = Date.now();
for (var i = 0; i < 2000000000; i++) {
var temp = i * i * Math.sqrt(i);
temp = temp + temp;
}
console.log(Date.now() - time); **-> Printed #2 **
setTimeout(function () {
console.log('Third timeout'); **-> Pushed to eventloop #2 !!**
}, 50);
console.log('End'); **-> Printed #3 **
注意:"第三次超时"被推到了事件循环#2而不是#1,尽管它有50ms比100ms(第一次),因为它是在你长时间等待循环后处理的,这需要足够的时间才能达到第一次的超时。
EventLoop解释道:https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
相关文章:
- 无法在通过jQuery的ajax加载的页面中执行javascript
- JavaScript执行暂时挂起页面
- 如何在ReactJS JSX中执行嵌套的if-else语句
- 当js函数's已执行
- 哪个先执行
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- HTML表单提交时未执行外部函数
- 在Safari执行javascript之前对其进行修改
- Amd,希望确保某个东西总是最后执行
- 在Windows 10中自动执行例行程序(主要与浏览器交互)
- 递归使用 eval() 是检查程序执行的好方法吗?
- 如何做到这一点,使代码在不传递条件后执行函数
- 如何在执行此特定onclick事件时执行JavaScript函数
- 如何在从浏览缓存加载页面时执行javascript
- 如何处理node.js节点mongodb中的连接和查询队列
- 如何在JavaScript中生成执行队列
- 执行返回承诺的处理程序队列
- 如何检查异步执行的函数队列
- 为什么我的jQuery队列停止工作后执行一次
- JavaScript执行一个音频文件队列