语法
js
async function (param0) {
statements
}
async function (param0, param1) {
statements
}
async function (param0, param1, /* …, */ paramN) {
statements
}
async function name(param0) {
statements
}
async function name(param0, param1) {
statements
}
async function name(param0, param1, /* …, */ paramN) {
statements
}
注意: 表达式语句 不能以 async function 关键字开头,以避免与 async function 声明 产生歧义。只有在不能接受语句的上下文中,async function 关键字才会开始一个表达式。
参数
name可选-
函数名称。可以省略,这种情况下函数是匿名的。该名称仅在函数体内部局部有效。
paramN可选-
函数形式参数的名称。有关参数的语法,请参阅函数参考。
statements可选-
构成函数体的语句。
描述
async function 表达式与 async function 声明 非常相似,并且具有几乎相同的语法。async function 表达式和 async function 声明之间的主要区别在于函数名称,在 async function 表达式中可以省略它来创建匿名函数。async function 表达式可以用作 IIFE(立即执行函数表达式),它在定义后立即运行,允许你模仿顶层 await。有关更多信息,另请参阅有关函数的章节。
示例
使用异步函数表达式
js
function resolveAfter2Seconds(x) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(x);
}, 2000);
});
}
// async function expression assigned to a variable
const add = async function (x) {
const a = await resolveAfter2Seconds(20);
const b = await resolveAfter2Seconds(30);
return x + a + b;
};
add(10).then((v) => {
console.log(v); // prints 60 after 4 seconds.
});
// async function expression used as an IIFE
(async function (x) {
const p1 = resolveAfter2Seconds(20);
const p2 = resolveAfter2Seconds(30);
return x + (await p1) + (await p2);
})(10).then((v) => {
console.log(v); // prints 60 after 2 seconds.
});
异步 IIFE
在不支持顶层 await 的上下文中,async IIFE 允许你使用 await 和 for...await。这里我们使用箭头函数来定义 IIFE,但也可以使用 async function 表达式。
js
const getFileStream = async (url) => {
// implementation
};
(async () => {
const stream = await getFileStream("https://domain.name/path/file.ext");
for await (const chunk of stream) {
console.log({ chunk });
}
})();
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # sec-async-function-definitions |
浏览器兼容性
加载中…