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

时间:2017-07-26 20:37:10

标签: javascript async-await

据我所知,the specthe documentation都有await作为async/await功能中唯一的保留关键字。

我们可以命名变量async

,这进一步说明了这一点

例如:

var async = 5;
console.log(async) // this is fine

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

Node

Chrome(59)

Chrome

Firefox(54)

Firefox

是否因为向后兼容?我猜许多代码库会使用名称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)

1 个答案:

答案 0 :(得分:9)

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

async function() { }
async () => { }
obj = { async foo() { } };

除了将async视为指示异步函数之外,所有这些都无法以任何方式进行解析。

另一方面,await理论上可以用在诸如

之类的陈述中
async function foo() {
  await(1);
}

含糊不清;是await等待值1,还是使用参数1调用的函数?因此,await需要是一个保留字(在异步函数内部;在外部,可以随意使用它作为变量)。

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