如果我想使用 await,为什么 Javascript (ES.next) 会强制我将函数声明为异步?

Why does Javascript (ES.next) force me to declare a function as async if I want to use await?

似乎编译器/解析器应该足够聪明,可以检测函数是否使用 await 然后它会自动变成 async 函数。

为什么我必须输入 async 关键字?它增加了混乱,很多时候我忘记添加它并且出现错误然后我必须去添加它。

让编译器在看到 await 时自动将函数提升到 async 并为每个人省去处理它的麻烦会有什么缺点吗?

将异步函数与 ES6 生成器函数进行比较,很明显:

function* x() {} // Generator function without 'yield'
Object.getPrototypeOf(x); // returns GeneratorFunction

生成器函数与传统函数有着本质上的不同,但它们不需要在函数体中包含 yield 表达式。实际上有 a bug in the ES6 proposal 声明如果生成器函数不包含 yield 是语法错误,但它很快被修复:

One important use case is prototyping with a dummy generator. Or the case where you comment out a yield for debugging. That shouldn't render the program illegal.

异步函数也是如此:根据 the draft,异步函数不需要在其主体中包含 awaits,同时仍然与传统函数表现不同。

假设您评论了 await。解释器是否应该将您的异步函数解析为传统函数并可能破坏您的整个代码?最好不要。