Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么等待和异步变量名是有效的?_Javascript_Async Await_Specifications_Language Design_Ecmascript 2017 - Fatal编程技术网

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

Javascript 为什么等待和异步变量名是有效的?,javascript,async-await,specifications,language-design,ecmascript-2017,Javascript,Async Await,Specifications,Language Design,Ecmascript 2017,我曾尝试在不同的关键字和运算符周围解释/,发现以下语法完全合法: //等待不是承诺的事情是好的,只是做起来很奇怪: const foo=wait/barbaz/ myFn()保留关键字不能用作。与大多数其他特殊Javascript单词(如问题中列出的单词,let,finally,…)不同,wait不是保留关键字,因此将其用作变量名不会引发语法错误。当新的语法出现时,为什么它没有变成一个保留关键字 向后兼容性 回到2011年,当ES5还是一个相对较新的东西时,使用await(和async)作为变

我曾尝试在不同的关键字和运算符周围解释
/
,发现以下语法完全合法:

//等待不是承诺的事情是好的,只是做起来很奇怪:
const foo=wait/barbaz/

myFn()
保留关键字不能用作。与大多数其他特殊Javascript单词(如问题中列出的单词,
let
finally
,…)不同,
wait
不是保留关键字,因此将其用作变量名不会引发语法错误。当新的语法出现时,为什么它没有变成一个保留关键字

向后兼容性 回到2011年,当ES5还是一个相对较新的东西时,使用
await
(和
async
)作为变量名的代码是完全有效的,因此您可能在一些网站上看到过类似的情况:

function timeout(ms) {
  var await = $.Deferred();
  setTimeout(await.resolve, ms);
  return await.promise();
};
这个变量名的选择可能看起来很奇怪,但它并没有错
await
async
从来都不是保留关键字-如果ES2017规范的编写者将
await
设置为保留关键字,并且浏览器实现了该更改,那么使用较新浏览器访问这些旧站点的用户将无法使用这些站点;它们很可能会坏掉

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

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

您可以看到这些与和的交互作用-当浏览器开始提供它们时,发现它们由于名称冲突而破坏了一些现有站点,因此浏览器退出了实现,必须调整规范(方法重命名为和)


实际上,存在一种情况,
wait
不能用作ES6模块内部的标识符:


const await='它工作吗?';

今天要与自己交谈。。不,只是开玩笑而已。在你回答之前,我最初的直觉反应是相容性。我认为这也是为什么的
没有被保留的原因,尽管即使在模块模式下这仍然有效。您认为向后兼容性正在发挥作用的假设是正确的。这就是为什么我们还必须在函数声明站点添加
async
关键字,以将上下文从“wait是一个标识符”更改为“wait是一个关键字”。出于完全相同的原因,我们有
函数*
收益
,它也是生成器之外的有效标识符名称。