为什么 await 和 async 是有效的变量名? [英] Why are await and async valid variable names?

查看:27
本文介绍了为什么 await 和 async 是有效的变量名?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在尝试使用不同的关键字和运算符时如何解释 /,并发现以下语法是完全合法的:

//等待不是 Promise 的东西很好,只是这样做很奇怪:const foo = 等待/barbaz/myFn()

错误:

<块引用>

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

看起来它试图将 await 解析为变量名..?我期待着

<块引用>

await 只在 async 函数中有效

或者类似的东西

<块引用>

意外的令牌等待

令我害怕的是,你甚至可以为它分配东西:

const await = '等等,这真的有效吗?';console.log(await);

如此明显的错误难道不应该导致语法错误,就像letfinallybreak 等那样吗?为什么允许这样做,第一个片段中到底发生了什么?

解决方案

保留关键字不能用作 标识符(变量名).与大多数其他特殊的 Javascript 词(如问题中列出的那些,letfinally、...)不同,awaitnot 保留关键字,因此将其用作变量名不会引发 SyntaxError.为什么新语法出来的时候没有把它做成保留关键字?

向后兼容

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

函数超时(毫秒){var await = $.Deferred();setTimeout(await.resolve, ms);返回 await.promise();};

这个变量名的选择可能看起来很奇怪,但它没有任何错误.awaitasync 从来都不是保留关键字——如果 ES2017 规范的作者把 await 变成了保留关键字,并且浏览器实现了这个改变,在较新的浏览器上访问这些旧站点的人将无法使用这些站点;它们很可能会坏掉.

因此,也许如果将它们制作成保留关键字,少数 个选择特殊变量名称的网站将无法正常工作 - 为什么这些网站的存在会永久影响 ECMAscript 的未来发展和导致像问题中那样混乱的代码?

因为浏览器会拒绝实现破坏现有网站的功能.如果用户发现某个网站不能在一个浏览器上运行,但可以在另一个浏览器上运行,这将激励他们切换浏览器 -第一个浏览器的制造商不希望这样,因为这对他们来说意味着更少的市场份额,即使它是一个使语言更加一致和易于理解的功能.此外,规范的编辑者不希望添加永远不会实现(或只会偶尔实现)的内容,因为那样规范将失去其作为标准的某些地位——与其主要目标背道而驰.

您可以通过 Array.prototype.flattenArray.prototype.contains - 当浏览器开始发布它们时,发现它们由于名称冲突而破坏了一些现有站点,因此浏览器退出了实现,并且必须调整规范(方法被重命名为 .flat.includes).


实际上有一种情况,await 不能用作标识符,这是在 ES6 模块内部:





        
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆