Open Yang03 opened 7 years ago
https://github.com/creeperyang/blog/issues/21 http://fex.baidu.com/blog/2015/07/we-have-a-problem-with-promises/ http://www.ituring.com.cn/article/120765 https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/ http://www.cnblogs.com/simonbaker/p/5715393.html https://developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
先看下一段代码:
function log(msg) {
console.log(msg)
}
log('EventLoop')
setTimeout(function() {
log('setTimeout')
}, 100)
setTimeout(function() {
console.log('zero delay')
},0)
函数调用会产生堆栈
对象被分配在一个堆中,一个用以表示一个内存中大的未被组织的区域。
调用 setTimeout 函数会在一个时间段过去后在队列中添加一个消息。 如果队列中没有其它消息,消息会被马上处理。 但是,如果有其它消息,setTimeout 消息必须等待其它消息处理完。 第二个参数仅仅表示最少的时间 而非确切的时间
零延迟 (Zero delay) 并不是意味着回调会立即执行。在零延迟调用 setTimeout 时 ,其并不是过了给定的时间间隔后就马上执行回调函数。 其等待的时间基于队列里正在等待的消息数量
$('button').on('click', function onClick() {
console.log('click')
})
当你点击按钮,会把function onClick 添加到队列中去,调用栈,会在空闲的时候去执行
event loop
event loop process model
当一个调用栈为空时,会执行下面的步骤:
other
当一个macrotask 在运行时,可以注册新的事件,所以新的task 会被创建
task 在microtask 会在当前循环中执行,macrotask queue 会在下一个event loop 循环中
click, ajax setTimeout 等的callback都是macrotask
参考链接