JS(ES8 +):为什么`async`不是保留字?

nem*_*035 10 javascript async-await

据我所知,规范文档都是awaitasync/await功能中唯一保留的关键字.

我们可以命名变量这一事实进一步证明了这一点async:

例如:

var async = 5;
console.log(async) // this is fine
Run Code Online (Sandbox Code Playgroud)

节点(6.10)(也在Repl.it上)

节点

Chrome(59)

铬

火狐(54)

火狐

是因为向后兼容吗?我猜许多代码库会使用async某些功能的名称.

这允许一些奇怪的代码示例:

async function async() {
  var async = 5;
  await async;
  return async;
}
async().then(console.log)
Run Code Online (Sandbox Code Playgroud)

无限递归承诺链?(不是很重要,因为任何函数名称都允许这样做,但是这段代码看起来更令人困惑)

async function async() {
  await async();
}
// stackoverflow (might need to open your console to see the output)
Run Code Online (Sandbox Code Playgroud)

小智 10

async不需要是保留字,因为它可以被唯一标识.它可能出现的背景是那些

async function() { }
async () => { }
obj = { async foo() { } };
Run Code Online (Sandbox Code Playgroud)

除了看到async指示异步函数之外,所有这些都无法以任何方式解析.

另一方面,await理论上可以用在诸如此类的陈述中

async function foo() {
  await(1);
}
Run Code Online (Sandbox Code Playgroud)

这是模棱两可的; 正在await等待该值1,还是使用参数调用的函数1?因此,await需要一个保留字(在异步函数内部;外部,随意使用它作为变量).

请记住,JavaScript自其起源以来已经发生了很大变化.许多单词被指定为保留,然后从未使用过,或者在技术上它们可能不需要被指定为保留.指定await为保留字(在模块内),而非指定async为保留字,是其设计者对语言的更成熟理解的产物.

  • 我认为@ nem035关于async在所有上下文中都不清楚的混淆来自于假设`async()=> {}`可以应用于关键字或称为`async`的函数,但是这里的歧义通过`的存在来解决. =>`因为箭头函数不能命名为函数(通过用`=`运算符赋值它们来接受). (2认同)