SyntaxError: await/yield expression can't be used in parameter
當預設引數表示式包含await或yield關鍵字並導致預設引數求值暫停時,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
哪裡出錯了?
預設表示式必須能夠同步求值。如果它包含 await 或 yield 表示式,它將暫停預設表示式的求值,這是不允許的。
注意:此錯誤僅在 await 或 yield 在此函式上下文中是有效運算子時才會生成。否則,await 或 yield 將被解析為識別符號,並且不會導致錯誤,或者如果其後有表示式,則會導致“保留識別符號”或“意外的標記”之類的錯誤。
示例
無效案例
js
function *gen(a = yield 1) {}
async function f(a = await Promise.resolve(1)) {}
有效情況
你可以使用空值合併賦值來提供預設值。如果你想對 null 和 undefined 進行不同的處理,則需要使用條件語句。
js
function* gen(a) {
a ??= yield 1;
}
async function f(a) {
a ??= await Promise.resolve(1);
}
如果表示式包含在初始化器的函式表示式中,並且不會暫停預設表示式的求值,你也可以使用 await 或 yield。
js
async function f(a = (async () => await Promise.resolve(1))()) {}