Should the following code work?
if(true) {
async function bar() {
console.log("hello");
}
}
bar();
Chrome 80 and Firefox 72 both throw a ReferenceError
saying bar
is not defined. So it seems like async function bar() {...}
declarations are block scoped whereas function bar() {...}
declarations are function scoped? Confusing if that's the case, but can someone just confirm that for me with a link to the relevant part of the spec?
Also, is there a way to make an async function
declaration function-scoped when declared from within a block?
It seems like
async function bar() {...}
declarations are block scoped
Yes, just like normal. Function declarations are block-scoped in general.
… whereas
function bar() {...}
declarations are function scoped?
Not really, except in sloppy mode for legacy reasons. This does not affect async function
and function*
declarations, which don't need any backwards-compatibility.