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