SyntaxError: await/yield expression can't be used in parameter

默认参数表达式包含awaityield关键字并导致默认参数求值暂停时,JavaScript 异常“await 表达式不能在参数中使用”或“yield 表达式不能在参数中使用”就会发生。

消息

SyntaxError: Illegal await-expression in formal parameters of async function (V8-based)
SyntaxError: await expression can't be used in parameter (Firefox)
SyntaxError: Cannot use 'await' within a parameter default expression. (Safari)

SyntaxError: Yield expression not allowed in formal parameter (V8-based)
SyntaxError: yield expression can't be used in parameter (Firefox)
SyntaxError: Unexpected keyword 'yield'. Cannot use yield expression within parameters. (Safari)

错误类型

SyntaxError

哪里出错了?

默认表达式必须能够同步求值。如果它包含 awaityield 表达式,它将暂停默认表达式的求值,这是不允许的。

注意:此错误仅在 awaityield 在此函数上下文中是有效运算符时才会生成。否则,awaityield 将被解析为标识符,并且不会导致错误,或者如果其后有表达式,则会导致“保留标识符”或“意外的标记”之类的错误。

示例

无效案例

js
function *gen(a = yield 1) {}

async function f(a = await Promise.resolve(1)) {}

有效情况

你可以使用空值合并赋值来提供默认值。如果你想对 nullundefined 进行不同的处理,则需要使用条件语句。

js
function* gen(a) {
  a ??= yield 1;
}

async function f(a) {
  a ??= await Promise.resolve(1);
}

如果表达式包含在初始化器的函数表达式中,并且不会暂停默认表达式的求值,你也可以使用 awaityield

js
async function f(a = (async () => await Promise.resolve(1))()) {}

另见