据我所知,the spec和the documentation都有await
作为async/await
功能中唯一的保留关键字。
我们可以命名变量async
:
例如:
var async = 5;
console.log(async) // this is fine
节点(6.10)(也在Repl.it上)
Chrome(59)
Firefox(54)
是否因为向后兼容?我猜许多代码库会使用名称async
来表示某些功能。
这允许一些看起来很奇怪的代码示例:
async function async() {
var async = 5;
await async;
return async;
}
async().then(console.log)
无限递归承诺链? (并不重要,因为任何函数名称都允许这样做,但是这段代码看起来更令人困惑)
async function async() {
await async();
}
// stackoverflow (might need to open your console to see the output)
答案 0 :(得分:9)
async
不需要是保留字,因为它可以被唯一标识。它可能出现的背景是那些
async function() { }
async () => { }
obj = { async foo() { } };
除了将async
视为指示异步函数之外,所有这些都无法以任何方式进行解析。
另一方面,await
理论上可以用在诸如
async function foo() {
await(1);
}
含糊不清;是await
等待值1
,还是使用参数1
调用的函数?因此,await
需要是一个保留字(在异步函数内部;在外部,可以随意使用它作为变量)。
请记住JavaScript自其起源以来已经发生了很大变化。许多单词被指定为保留,然后从未使用过,或者在技术上它们可能不需要被指定为保留。将await
指定为保留字(在模块内),将async
指定为保留字,是其设计者对语言的更成熟理解的产物