SyntaxError: await/yield expression can't be used in parameter

Ngoại lệ JavaScript "await expression can't be used in parameter" hoặc "yield expression can't be used in parameter" xảy ra khi biểu thức tham số mặc định chứa từ khóa await hoặc yield và có tác dụng tạm dừng việc đánh giá tham số mặc định.

Thông báo

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)

Loại lỗi

SyntaxError

Nguyên nhân?

Biểu thức mặc định phải có khả năng đánh giá đồng bộ. Nếu nó chứa biểu thức await hoặc yield, nó sẽ tạm dừng việc đánh giá biểu thức mặc định, điều này không được phép.

Note: Lỗi này chỉ được tạo ra khi await hoặc yield là toán tử hợp lệ trong ngữ cảnh hàm này. Nếu không, await hoặc yield sẽ được phân tích cú pháp như một định danh và không gây ra lỗi, hoặc gây ra lỗi như "reserved identifier" hoặc "unexpected token" nếu có biểu thức tiếp theo sau nó.

Ví dụ

Trường hợp không hợp lệ

js
function *gen(a = yield 1) {}

async function f(a = await Promise.resolve(1)) {}

Trường hợp hợp lệ

Bạn có thể sử dụng nullish coalescing assignment để cung cấp giá trị mặc định thay thế. Nếu bạn muốn xử lý nullundefined khác nhau, bạn cần sử dụng điều kiện.

js
function* gen(a) {
  a ??= yield 1;
}

async function f(a) {
  a ??= await Promise.resolve(1);
}

Bạn cũng được phép sử dụng await hoặc yield nếu biểu thức được chứa trong một biểu thức hàm của bộ khởi tạo và không tạm dừng việc đánh giá biểu thức mặc định.

js
async function f(a = (async () => await Promise.resolve(1))()) {}

Xem thêm