语法错误:在参数中不能使用 await/yield 表达式

默认参数 表达式包含 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)

错误类型

哪里出错了?

默认表达式必须能够同步评估。如果它包含 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))()) {}

另请参阅