async function 表达式

Baseline 已广泛支持

该特性已非常成熟,可在多种设备和浏览器版本上使用。自 2017 年 4 月以来,它已在各大浏览器上可用。

async function 关键字可用于在表达式内部定义一个异步函数。

你也可以使用 async function 声明箭头函数语法 来定义异步函数。

语法

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 允许你使用 awaitfor...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

浏览器兼容性

另见