javascript是一门单线程的非阻塞的脚本语言。单线程意味着javascript在执行代码的任何时候,都会只有一个主线程来处理所有的任务。
那么js引擎怎样去实现?
因为事件循环(eventloop)。
1、同步和异步任务分别进入不同的执行场所,同步的进入主线程,异步的进入Event Table并注册函数。
2、当指定的事情完成时,Event Table 会将这个函数移入Event Queue中。
3、主线程内的任务栈执行为空,回去 Event Queue读取对应的函数,进入主线程执行。
4、上述的过程不断重复,也就是Event Loop。
简单例子
console.log('1');
setTimeout(()=>{
console.log('2');
},0)
console.log('3');
// 1,3,2
因为setTimeout是一个异步的任务,所以会在最后执行。
复杂例子
console.log('1');
setTimeout(() => {
console.log('2')
}, 1000);
new Promise((resolve, reject) => {
setTimeout(() => {
console.log('3');
}, 0);
console.log('4');
resolve();
console.log('5');
}).then(() => {
console.log('6');
});
console.log('7');
// 1,4,5,7,6,3,2