理解一些任务队列

一些消息队列代码题

console.log('a')
while (true) {}
console.log('b')
// 能输出a,但里面的循环是死循环,所以后面的内容不会输出
console.log('a')
setTimeout(() => {
console.log('b')
})
while (true) {}

a

能输出a,这里面有异步任务和同步任务,先执行同步任务,后执行异步任务。

同步任务有:console.log('a') 和 while 循环。

异步任务有:定时器。

但while循环是死循环,所以同步任务永远无法执行完毕,异步任务也就不能执行。

console.log("---start---")
setTimeout(() => {
console.log("setTimeout")
})
new Promise((resolve, reject) => {
for (var i = 0; i < 5; i++) {
console.log(i)
}
resolve()
}).then(() => {
console.log("Promise")
})
console.log("---end---")
/*
---start---
0
1
2
3
4
---end---
Promise
*/
// 因为任务分同步任务和异步任务,异步任务又有宏任务和微任务之分。
// 执行顺序为:同步任务 > 异步任务(微任务 > 宏任务)
function wait() {
return new Promise(resolve => {
setTimeout(resolve, 10 * 1000)
})
}

async function main() {
console.time()
const a = await wait()
const b = await wait()
const c = await wait()
console.timeEnd()

console.time()
const a1 = wait()
const b1 = wait()
const c1 = wait()
await a1
await b1
await c1
console.timeEnd()

console.time()
const a2 = wait()
const b2 = wait()
const c2 = wait()
a2, b2, c2
console.timeEnd()
}
main()

// default: 31156.48681640625 ms
// default: 10006.406982421875 ms
// default: 0.07470703125 ms
var name = 'Tom';
console.log(name);
(function () {
console.log(name)
if (typeof name == 'undefined') {
name = 'Jack'
console.log('Goodbye ' + name)
} else {
console.log('Hello ' + name)
}
})()

Tom、Tom、Hello Tom

先在自执行函数作用域中找name,没找到就去外层找,恰好外层有name,就拿来用了,然后就进入了else语句,输出了 Hello Tom