SyntaxError: await/yield expression can't be used in parameter
The JavaScript exception "await expression can't be used in parameter" or "yield expression can't be used in parameter" occurs when thedefault parameter expression contains theawait
oryield
keyword and has the effect of pausing default parameter evaluation.
Message
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)
Error type
What went wrong?
The default expression must be able to evaluatesynchronously. If it contains anawait
oryield
expression, it will pause the evaluation of the default expression, which is not allowed.
Note:This error is only generated whenawait
oryield
are valid operators in this function context. Otherwise,await
oryield
would be parsed as an identifier, and either not cause an error, or cause an error like "reserved identifier", or "unexpected token" if there's an expression following it.
Examples
Invalid cases
function *gen(a = yield 1) {}async function f(a = await Promise.resolve(1)) {}
Valid cases
You can use thenullish coalescing assignment to provide a default value instead. If you want to treatnull
andundefined
differently, you would need to use a condition.
function* gen(a) { a ??= yield 1;}async function f(a) { a ??= await Promise.resolve(1);}
You are also allowed to useawait
oryield
if the expression is contained in a function expression of the initializer and would not pause the evaluation of the default expression.
async function f(a = (async () => await Promise.resolve(1))()) {}