【问题标题】:`function` declarations are function scoped, but `async function` declarations are block scoped?`function` 声明是函数范围的,但 `async function` 声明是块范围的?
【发布时间】:2020-06-08 02:23:33
【问题描述】:

下面的代码应该工作吗?

if(true) {
  async function bar() {
    console.log("hello");
  }
}
bar();

Chrome 80 和 Firefox 72 都抛出 ReferenceErrorbar 未定义。所以看起来async function bar() {...} 声明是块作用域,而function bar() {...} 声明是函数作用域?如果是这种情况令人困惑,但有人可以通过规范相关部分的链接为我确认吗?

另外,有没有办法在块内声明 async function 声明函数范围?

【问题讨论】:

  • 我相信它的行为类似于 letconst
  • 嗯。它在 node.js 中的行为相同
  • 我想如果你想突破块范围,你可以这样做:var bar = async function () {}
  • 范围内似乎没有任何关于此的内容,@MysterX 可能是对的。

标签: javascript scope async-await


【解决方案1】:

似乎async function bar() {...} 声明是块作用域

是的,就像平常一样。函数声明通常是块范围的。

...而function bar() {...} 声明是函数作用域的?

不是,except in sloppy mode for legacy reasons。这不会影响 async functionfunction* 声明,它们不需要任何向后兼容性。

【讨论】:

  • 您在那里使用了“像正常”和“一般”这样的术语来指代严格模式代码,对吧? IE。 ES6 模块脚本中的代码,或者"use strict"; 已明确写在脚本或函数的顶部?
  • @joe 是的,就像在 ES6 模块中一样 :-) 另外我认为有些 EcmaScript 引擎根本没有实现附件 B。
猜你喜欢
  • 2022-01-07
  • 2011-06-12
  • 2015-03-14
  • 2015-10-02
  • 1970-01-01
  • 2017-04-05
  • 2018-01-21
  • 2018-10-26
相关资源
最近更新 更多