js事件循环机制

158 阅读1分钟

我们都知道js事件分为同步事件和异步事件。 因为js是单线程的,所以同步事件将被直接放入函数堆栈,而异步事件将被放入其他模块处理。

js循环机制
在上图中,调用栈中遇到DOM操作、ajax请求以及setTimeout等WebAPIs的时候就会交给浏览器内核的其他模块进行处理,webkit内核在Javasctipt执行引擎之外,有一个重要的模块是webcore模块。对于图中WebAPIs提到的三种API,webcore分别提供了DOM Binding、network、timer模块来处理底层实现。等到这些模块处理完这些操作的时候将回调函数放入任务队列中,之后等栈中的task执行完之后再去执行任务队列之中的回调函数。

下面将用典型的例子来解析js执行时的事件循环机制。

1.
console.log('hi');
setTimeout(function cb(){
    console.log('cb')
},5000);
console.log('js')
2.
for (var i = 0; i < 5; i++) {
    setTimeout(function() {
      console.log(new Date, i);
    }, 1000);
}
console.log(new Date, i);
3.
(function test() {
    setTimeout(function() {console.log(4)}, 0);
    new Promise(function executor(resolve) {
        console.log(1);
        for( var i=0 ; i<10000 ; i++ ) {
            i == 9999 && resolve();
        }
        console.log(2);
    }).then(function() {
        console.log(5);
    });
    console.log(3);
})()

参考链接 参考链接