ES 2017:异步函数 vs AsyncFunction(object) vs 异步函数表达式

2024-03-30

我刚刚读到async functions并遇到了 ES2017 的一些类似功能。它造成了很多混乱,我只想问:

  1. 有什么区别async function, AsyncFunction(用于创建异步函数)和异步函数表达式(我认为这只是另一个异步函数)?
  2. 我什么时候应该使用一种格式而不是另一种格式?

重点介绍每个人的怪癖和表现将不胜感激!


在 Javascript 中创建函数有四种方法。在 Javascript 中还有四种创建异步函数的方法,它们是彼此精确的镜像。

为了演示这是如何工作的,我使用了一个简单的sleep函数,全局声明:

function sleep(time) {
    return new Promise(function(resolve, reject) {
        setTimeout(function() {
            resolve();
        }, time);
    });
}

函数声明

function speak() { return 'Hi'; }
async function speak() { await sleep(1000); return 'Hi'; }

这是声明函数的最简单方法。它可以声明一次并提升到当前函数作用域的顶部。

函数声明和异步函数声明完全相同,除了async函数总是返回一个承诺并允许您使用await.

函数表达式

let speak = function() { return 'Hi'; } // anonymous function expression
let speak = function speakFn() { return 'Hi'; } // named function expression

let speak = async function() { await sleep(1000); return 'Hi'; } // anonymous asynchronous function expression
let speak = async function speakFn() { await sleep(1000); return 'Hi'; } // named asynchronous function expression

函数表达式看起来非常像函数声明。然而,它们并没有被提升到函数作用域的顶部。您可以根据需要多次重新定义它们。它们可以内联定义。它们可以是匿名的,也可以是命名的:如果它们是命名的,那么该名称指的是该函数范围内的函数。

函数表达式和异步函数表达式完全相同,除了async函数总是返回一个承诺并允许您使用await.

箭头功能

let speak = word => 'Hi ' + word; // one parameter
let speak = (word1, word2) => 'Hi ' + word1 + word2; // multiple parameters

let speak = async word => { await sleep(1000); return 'Hi ' + word; } // one parameter
let speak = async (word1, word2) => { await sleep(1000); return 'Hi ' + word1 + word2; } // multiple parameters

箭头功能 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions是 ES2015 (ES6) 中引入的定义函数的快速而简短的方法。它们在大多数方面等同于函数表达式,除了它们始终是匿名的并且值this总是词法绑定的,即从外部作用域继承。

箭头函数和异步箭头函数完全相同,除了async函数总是返回一个承诺并允许您使用await。 (它们在上面的语句中略有不同,因为每个异步函数内部都有多个语句。这意味着这些语句需要包含在一个块中{}return需要明确。对于长度超过一条语句的普通箭头函数也是如此。)

函数构造函数

let speak = new Function('word', 'return "Hi " + word;');
let speak = new AsyncFunction('word', 'await sleep(1000); return "Hi " + word;')

函数构造函数允许您使用字符串动态定义函数。请注意,它们始终在全局范围内运行,并且无法访问定义它们的范围。它们仅适用于极少数情况 https://stackoverflow.com/q/3026089/417562。我个人不认为异步函数构造函数会有什么用处。 ES2017 的作者同意我的观点,因为AsyncFunction不是全局对象,必须首先使用const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor.

使用函数构造函数创建的函数和使用匿名函数构造函数创建的函数完全相同,除了async函数总是返回一个承诺并允许您使用await。 (但你已经猜到了,对吧?)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES 2017:异步函数 vs AsyncFunction(object) vs 异步函数表达式 的相关文章

随机推荐

  • 在PE的导入表中添加一个条目

    我正在寻找一个命令行程序来向 PE 文件的导入表添加条目 我的目标是将一个新的导入函数从外部 DLL 添加到我的 EXE 然后使用 ollydbg 使用代码洞穴插入新代码 新代码将使用新导入的函数 实际上我已经实现了我的目标 但是要向我使用
  • 使用 LINQWhere 查询仅获取部分 ConfigurationManager.ConnectionStrings

    我的目标是使用 LINQWhere查询于ConfigurationManager ConnectionStrings控制台应用程序中的集合 假设一个新的 NET 4 5 控制台应用程序添加了 System Configuration 引用
  • 一个构造函数 - 多个参数

    我在一些 Java 编程竞赛中找到了一个任务 必须创建仅包含一个参数 文本 和一个构造函数的类 Sentence 这是示例测试代码 Sentence s1 new Sentence only CAT s2 new Sentence and
  • 用户“”登录失败

    我有一个 ASP Net MVC 网站 在本地测试时工作正常 我已将该网站放入您的 Windows Server 2008 计算机上的 IIS 7 中 该网站使用 net 会员提供商 当我尝试登录时收到以下错误 Login failed f
  • 使用python限制类实例的数量

    我的主类创建了一个简单的QmainWindows像这样 class mcManageUiC QtGui QMainWindow def init self super mcManageUiC self init self initUI de
  • 使用 perl 格式化字符串和日期

    我想转换 使用perl 05 26 2013 06 09 47 to 26 05 2013 06 09 47 另外我怎样才能将上面的日期和时间更改为 GMT 日期和时间 use DateTime Format Strptime qw my
  • 用户查找加密数据库字段

    本质上 我有一个保存用户数据的表 所有这些数据都是 AES 加密的 在 BLOB 字段中 这意味着这些字段都不能被索引 这将减慢该表上的任何查询 特别是因为在进行任何匹配之前整个表需要解密 WHERE AES DECRYPT user em
  • 从树视图 tkinter 复制项目

    我的一个 tkinter 应用程序中有一个树视图 我想知道是否真的可以通过用户右键单击来复制选定的字段 如果没有 是否有任何其他小部件允许用户复制 GUI 窗口中显示的选定字段 Code log Toplevel root log titl
  • javascript向函数添加属性

    假设我们有一个函数 function Rabbit console log shiv 现在 无需创建该函数的对象 我就可以分配该对象的属性 Rabbit bark function line console log name is line
  • 使用 Iso_Fortran_Env 设置函数的 Kind 值

    如何使用 ISO Fortran Env 的内在函数以 Fortran 2008 惯用的方式设置函数的返回 KIND 值 通常在主程序中 我可以使用 ISO Fortran 内在函数 如下所示 program name here use i
  • jQuery 事件适用于 Firefox,不适用于 Chrome

    我在代码中注册了一些点击事件 它们在 Firefox Windows 和 Mac 中正常运行 但在 Chrome 中无法执行 尝试过 Windows 和 Mac beta JavaScript 的目的是根据 select 元素的值显示正确的
  • 检查一个 Int 值是否大于或等于另一个 Int 值?价值? [复制]

    这个问题在这里已经有答案了 如何比较两个 Int 值 所以 我有这个 let limit Int let current Int Int self stringValue 但是当我尝试比较它们 大于或等于 时 if current gt s
  • 如何使 JAWS 等屏幕阅读器可以访问“正在加载”图标?

    所以 HTML 代码是这样的 div style display none img src PT LOADING gif alt Processing please wait title div 即使提供了 ALT 文本 在更改样式以显示图
  • 函数 while 循环中的 return 是如何处理的?

    我有一个函数 该函数内部有一个 while 循环 当我尝试使用 IF 语句在 while 循环内设置非局部变量 然后退出整个函数时 突然该变量不再设置 function EXAMPLE cat test txt while read LIN
  • insertRow 与appendChild

    向表中添加行时首选哪种方法 var tr tbl insertRow 1 or var tr document createElement tr tbl appendChild tr insertRow会好得多 这是支持的 http www
  • 为什么此 GeoTool 片段不生成可查看的 shapefile?

    我正在创建一个简单的程序 它从 csv 文件读取值并根据这些值创建 shp 文件 这是一个轻微的修改这个例子 http docs geotools org latest tutorials feature csv2shp html 形状文件
  • JUL 适配器不适用于 Jersey

    我正在尝试使用七月适配器将 Java Util Logging 委托给 Log4j2 更准确地说 任何使用 JUL 生成日志的第三方库都应该委托给 Log4j2 作为一个简单的练习 我创建了一个使用库的独立应用程序 我创建这个库是为了测试目
  • Steam API 所有游戏

    我一直在阅读论坛并尝试 Steam API 我正在寻找提供所有 Steam 游戏的 API 我发现提供所有 SteamApp 的 API 以及提供应用程序信息的 Steam 商店 API 我正在寻找类型 游戏 但为此 我需要为每个 Stea
  • 如何在两个微服务之间共享 REST 服务实体?

    我使用 java 创建了两个微服务 我需要从服务 A 到服务 B 进行 REST api 调用 发送的数据将采用 JSON 格式 使用 jax rs 我需要在这两个服务中创建实体类 由于两个项目中的实体类相同 我可以吗 创建一个通用 jar
  • ES 2017:异步函数 vs AsyncFunction(object) vs 异步函数表达式

    我刚刚读到async functions并遇到了 ES2017 的一些类似功能 它造成了很多混乱 我只想问 有什么区别async function AsyncFunction 用于创建异步函数 和异步函数表达式 我认为这只是另一个异步函数