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))()) {}

另見