问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

为什么js里使用了await的方法必须定义成async的?

发布网友 发布时间:2024-10-02 11:43

我来回答

1个回答

热心网友 时间:2024-10-19 07:26

在JavaScript中,async/await 和 Generator 的概念紧密相关。async/await 实际上是对 Generator 的一种语法糖,它被设计为具有自动 spawn 功能的 Generator,其特殊标记(async)的使用原因类似于 Generator 需要特殊标记(*)。

我们首先需要了解为什么 Generator 不能直接使用 function 而是采用了一个 function * 的怪异语法。追溯到 Generator 语法最早的版本实现,可以发现,Mozilla JS 1.7 的 Generator 并不需要特殊标记,仅是一个包含 yield 语句的特殊函数。然而,当 Mozilla 的开发者计划将这一语法特性标准化时,考虑到了以下几点原因:在非严格模式下,await 不是保留字以及从可读性的角度出发。

随着现代前端代码逐渐迁移到了 ES Module(默认为严格模式),标准委员会也在逐步扩大 await 的使用场景,并引入了 top-level await 提案。这一提案允许在 Module 环境下直接使用 await,然而实现这一功能时需要注意的不仅有词法解析、语法设计等,还有一系列实现细节上的小问题,如潜在的死锁问题、可能影响模块加载时间以及与 CommonJS 模块的兼容性。

标准委员会最终决定将 top-level await 从 await/async 提案中独立出来,进行单独标准化,并与各个执行环境(loader)进行协作。在后续的讨论中,还引发了一次较大讨论:“Top-level await is a footgun”。尽管提案已进展到了 Stage 3,建议阅读提案的 FAQ 部分,但进入标准的进程仍面临困难,TC39 成员代表已表达强烈反对。

从这一提案的经历中,可以得出另一个相比在任意情况下都允许 await,将其限制在 async function {} 块中,实现起来更为简便。出于实用主义的考虑,将限制添加到功能实现中,更符合广大 JavaScript 开发者的利益。

在最初的设想中,async function 实际上等同于 function { return spawn(function*() ); }。在非严格模式下,函数 f() { var yield = 1; return yield; } 是合法的,这反映了早期版本对语法的考虑。在当时的观点中,有人持有“ES6 不需要 opt-in”的立场,但现在回过头来看,"use strict" 和 script type="module" 这种形式的 opt-in 确实影响了用户接受度,因此标准委员会整体倾向于在 ES6 新特性中尽可能兼容旧代码。

在早期版本的 async function 草案中,语法上的考虑被提及,反映了标准制定过程中的复杂性和权衡。await 在非严格模式下作为保留字,以及在严格模式下的直接使用,体现了 JavaScript 标准制定者在设计语法时的深思熟虑。

热心网友 时间:2024-10-19 07:25

在JavaScript中,async/await 和 Generator 的概念紧密相关。async/await 实际上是对 Generator 的一种语法糖,它被设计为具有自动 spawn 功能的 Generator,其特殊标记(async)的使用原因类似于 Generator 需要特殊标记(*)。

我们首先需要了解为什么 Generator 不能直接使用 function 而是采用了一个 function * 的怪异语法。追溯到 Generator 语法最早的版本实现,可以发现,Mozilla JS 1.7 的 Generator 并不需要特殊标记,仅是一个包含 yield 语句的特殊函数。然而,当 Mozilla 的开发者计划将这一语法特性标准化时,考虑到了以下几点原因:在非严格模式下,await 不是保留字以及从可读性的角度出发。

随着现代前端代码逐渐迁移到了 ES Module(默认为严格模式),标准委员会也在逐步扩大 await 的使用场景,并引入了 top-level await 提案。这一提案允许在 Module 环境下直接使用 await,然而实现这一功能时需要注意的不仅有词法解析、语法设计等,还有一系列实现细节上的小问题,如潜在的死锁问题、可能影响模块加载时间以及与 CommonJS 模块的兼容性。

标准委员会最终决定将 top-level await 从 await/async 提案中独立出来,进行单独标准化,并与各个执行环境(loader)进行协作。在后续的讨论中,还引发了一次较大讨论:“Top-level await is a footgun”。尽管提案已进展到了 Stage 3,建议阅读提案的 FAQ 部分,但进入标准的进程仍面临困难,TC39 成员代表已表达强烈反对。

从这一提案的经历中,可以得出另一个相比在任意情况下都允许 await,将其限制在 async function {} 块中,实现起来更为简便。出于实用主义的考虑,将限制添加到功能实现中,更符合广大 JavaScript 开发者的利益。

在最初的设想中,async function 实际上等同于 function { return spawn(function*() ); }。在非严格模式下,函数 f() { var yield = 1; return yield; } 是合法的,这反映了早期版本对语法的考虑。在当时的观点中,有人持有“ES6 不需要 opt-in”的立场,但现在回过头来看,"use strict" 和 script type="module" 这种形式的 opt-in 确实影响了用户接受度,因此标准委员会整体倾向于在 ES6 新特性中尽可能兼容旧代码。

在早期版本的 async function 草案中,语法上的考虑被提及,反映了标准制定过程中的复杂性和权衡。await 在非严格模式下作为保留字,以及在严格模式下的直接使用,体现了 JavaScript 标准制定者在设计语法时的深思熟虑。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
64岁的老头感冒了,还喝一瓶啤酒,又喝3包感冒药,吃了3个阿莫西林消炎药... ...今天中午12点喝了一瓶啤酒,不会有反应死了吧? 喝一瓶啤酒吃药没事吧 养育孩子有哪些正确的方式? 联想电脑一开机就蓝屏怎么解决 光遇冥想任务怎么完成_冥想任务攻略 光遇 光遇云野的锦鲤池冥想怎么做? 光遇 光遇在滑冰场旁冥想的任务怎么做? 光遇在仙乡的金塔下冥想任务怎么做 任务达成方法介绍 光遇 光遇在禁阁的神坛旁冥想怎么做? async和await有什么区别? 电视背光技术有什么区别? 从科技角度来看电视面板有哪些区别,不同的面板,对电视画质影响大吗? 温州市区内哪里有海澜之家服饰的专卖点 五粮液股价为什么这么低 杀手4:血钱游戏配置 终极刺客:血钱关于武器 《终极刺客4:血钱》全隶略详解介绍_《终极刺客4:血钱》全隶略详解是什 ... 血钱新增恶名系统 终极刺客4:血钱游戏特色介绍 终极刺客:血钱的评价系统 有谁能告诉我一些关于赞美钻石的语句 初中化学问题选择题,原子团有关的 华润面试流程 在quartus II 10.0中 咋将vhd文件设置成当前文件 为什么实行股票 人们为什么要投资股市? 非常的近义词 非常近义词 股票的初衷是什么 哪种电饭煲能够放溢出 肠癌手术后为什么有肠瘘 肠瘘的常见症状 肠瘘预防 有关肠瘘的病理生理改变,不正确的是( )。 双口式肠瘘闭合术术中注意事项 债权转股权怎么操作 结肠瘘术后护理 债权转为股权会计分录怎么做 将债权转为股权分录 ...小时后,乙做1小时,然后丙做1小时,互换,要多少小时完成? ...需12小时,乙单独完成需15小时,甲乙合作1小时后,由甲单独做1小时,再... ...12小时,乙独做需15小时。若甲先做1小时,然后乙甲接替做1小时,再由... ...需12小时,乙单独完成需15小时。甲乙合作一小时后,由甲单独 1.一件工作,甲独做12小时完成,乙独做10小时完成,丙独做15小时完成。现在... 水库网箱养鱼有什么技术 请问有没有谁知道哪里的水库或河可以养鱼? 可以在养鱼的小型水库养殖金鱼吗 我家是吉林的 水深三米左右 库底是... 情人是公务员民警我又很多证据证明和我又关系我能去纪委告他吗?我关系... 国家公务员会有多张身份证用来经商吗 公务员政审是不是交了学历认证报告单位就差不多被录用了? 公务员考试中同一身份证号是否可以多人使用?