1.关于JavaScript
js是一门单线程语言。
2.javascript事件循环
同步和异步任务分别进入不同的执行“场所”,同步的进入主线程,异步的进入Event Table 并注册函数
当指定的事情完成时,Event Table 会将这个函数移入Event Queue
主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行
上述过程会不断重复,也就是常说的Event Loop(事件循环)
setTimeout这个函数,是经过指定时间后,把要执行的任务加入到Event Queue中,又因为是单线程任务要一个个执行,如果前面的任务需要的时间太长,那么只能等着。
3.广义的同步任务和异步任务
宏任务:包括整体代码 script,setTimeout,setIntervcal
微任务:Promise,process.nextTick
不同类型的任务会进入对应的Event Queue,比如setTimeout和setInterval会进入相同的Event Queue
事件循环的顺序,决定js代码的执行顺序。进入整体代码后,开始第一次循环。接着执行所有的微任务
然后再次从宏任务开始,找到其中一个任务队列执行完毕,在执行所有的微任务
- 宏任务和微任务的执行过程
例子一:
console.log('1');
setTimeout(function() {
console.log('2');
process.nextTick(function() {
console.log('3');
})
new Promise(function(resolve) {
console.log('4');
resolve();
}).then(function() {
console.log('5')
})
})
process.nextTick(function() {
console.log('6');
})
new Promise(function(resolve) {
console.log('7');
resolve();
}).then(function() {
console.log('8')
})
setTimeout(function() {
console.log('9');
process.nextTick(function() {
console.log('10');
})
new Promise(function(resolve) {
console.log('11');
resolve();
}).then(function() {
console.log('12')
})
})
例子二:
setTimeout(function() {
console.log('setTimeout');
})
new Promise(function(resolve) {
console.log('promise');
}).then(function() {
console.log('then');
})
console.log('console');
(8.9自我充电)
例子1,2可供理解。