当前位置: 首页 > 知识库问答 >
问题:

为什么是等待和异步有效的变量名?

靳举
2023-03-14

我在实验/在不同的关键字和运算符周围是如何解释的,发现以下语法是完全合法的:

// awaiting something that isn't a Promise is fine, it's just strange to do:
const foo = await /barbaz/
myFn()

错误:

未捕获的引用错误:等待未定义

它似乎试图将wait解析为变量名。。?我期待着

或者是类似于

意外令牌等待

令我恐惧的是,你甚至可以给它分配一些东西:

const await = 'Wait, this actually works?';
console.log(await);

如此明显错误的东西不应该导致语法错误吗,就像let终于打破等一样?为什么允许这样做,以及第一个片段中到底发生了什么?

共有1个答案

洪旻
2023-03-14

保留的关键字不能用作标识符(变量名)。与大多数其他特殊的Javascript单词不同(如问题中列出的那些,let最后,...),wait不是一个保留的关键字,所以使用它作为变量名不会抛出SynTaxError。为什么新语法出来时没有把它做成保留关键字?

早在2011年,ES5还是一个相对较新的东西,使用wait(和async)作为变量名的代码是完全有效的,所以你可能在几个网站上看到过这样的东西:

function timeout(ms) {
  var await = $.Deferred();
  setTimeout(await.resolve, ms);
  return await.promise();
};

这个变量名称的选择可能看起来很奇怪,但并没有错。waitasync从来都不是保留关键字——如果ES2017规范的作者将wait变成保留关键字,浏览器实现了这一变化,在新浏览器上访问这些旧网站的人将无法使用这些网站;他们很可能会崩溃。

因此,如果它们被做成保留关键字,一些选择了特殊变量名的站点可能无法正常工作——为什么这些站点的存在会永久性地影响ECMAscript的未来发展,并导致像问题中那样的代码混乱?

因为浏览器将拒绝实现破坏现有网站的功能。如果用户发现一个网站不在一个浏览器上运行,而是在另一个浏览器上运行,这将激励他们更换浏览器——第一个浏览器的制造商不会希望这样,因为这对他们来说意味着更少的市场份额,即使是使语言更加一致和易懂的功能。此外,规范的编辑器不想添加一些永远不会实现(或者只会偶尔实现)的东西,因为这样规范就会失去一些作为标准的地位——与它的主要目标相反。

您可以在Array.prototype.flattenArray.prototype.contains中看到这些交互-当浏览器开始发送它们时,发现它们由于名称冲突而破坏了一些现有的站点,因此浏览器退出了实现,规范必须进行调整(方法被重命名为。平面。包括)。

实际上,有一种情况是wait不能用作标识符,它位于ES6模块内部:

<script type="module">
  const await = 'Does it work?';
</script>
 类似资料:
  • 我正在研究promsies和async/await的用法。 我编写了以下代码,它执行以下操作: 它获取一些数据库数据(使用Knex.js), 处理该数据, 将处理的数据分配到指定的属性中 这3个步骤执行了多次(在下面的代码中,执行了两次),并且始终等待执行: 现在,我正在尝试编写与等效的promise链,这就是我想到的: 但这不太管用。发生的是,在第一个返回之后,中的结束了它的等待,这导致返回-并

  • 我一直在使用ECMAScript 很明显第一步是ECMAScript 下面是我如何实现基本promise的示例/伪代码- 随着时间的推移,我遇到了ECMAScript 同样,这里有一个伪代码,描述了我的异步等待函数的样子- 把语法错误(如果有的话)放在一边,我觉得它们做的事情完全一样。我几乎可以用async、Waities取代我的大部分promise。 当promise做类似的工作时,为什么需要异

  • 问题内容: 我是一名普通的C#开发人员,但有时我会使用Java开发应用程序。我想知道是否有Java等效于C#async / await?简单来说,java相当于什么: 问题答案: 不,在Java中-甚至在v5之前的C#中,都没有等效的异步/等待方式。 在后台构建状态机是一项相当复杂的语言功能。 Java中对异步/并发的 语言 支持相对较少,但是该软件包包含许多与此相关的有用 类 。(不完全等同于任

  • 我试图在react/electron项目中使用async/await,但它不起作用。我想要的是获取docker容器状态列表。但是安慰。日志(列表)返回未定义的。 有人能帮我吗?:)

  • 我在中写了这段代码 然后我尝试在另一个文件中使用它 我得到一个错误 “等待仅在异步函数中有效” 问题是什么?

  • 问题内容: 我写了这段代码 然后我尝试在另一个文件中使用它 我有一个错误 “等待仅在异步功能中有效” 有什么问题 问题答案: 错误不是指而是。 我利用这个问题的机会来告诉你一个已知的反模式的使用方法:。 错误 正确 另外,要知道有一个正确且重要的特殊情况:(使用try / catch)