一些消息队列代码题
console.log('a') while (true) {} console.log('b')
|
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---")
|
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()
|
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