我试图从ES7规范中找到它,但是找不到精确的东西。可以简单地将yield用作变量名。我的意思是

var yield;


语法错误?我做了一个简单的测试:

var a;
try{eval('var yield')}catch(b){a=1}
console.log(!a);


我在Chrome和Node.js(都使用v8引擎)中进行了尝试,并显示了true。但是,在Firefox中它显示false

据我所知,Firefox支持生成器功能和其他ES7东西,但其行为有所不同。是否取决于实现,还是Chrome或Firefox错误?

附言我问这个问题是因为我正在编写JavaScript模糊处理程序,所以我很想知道是否可以利用此功能。

最佳答案

yield是ES7中的保留字。但是在该语言的过时版本中是允许的。因此,禁止将yield用作标识符仅限于严格模式。

因此,这将产生一个错误:


"use strict"
var yield = true;
console.log(typeof yield);





这可以在不中断网络的情况下起作用:



var yield = true;
console.log(typeof yield);





在当前自动更新的Firefox和Chrome版本中,这些测试的行为相同,因此我不确定您检测到的差异是如何产生的。 Firefox 53.0.2为发布的代码生成一个true结果。

1个
关于yield保留字的更多历史记录。


第7.5.2节(当前)或7.5.3节(保留未来)中未保留ES3
ES5作为将来的保留字引入,要求在严格模式下将错误作为标识符(第7.6.1.2节)
ES6和ES7均在11.6.2.1节中将yield声明为保留字,并注意在严格模式(第12.1.1节)之外,允许将其用作标识符,而不会出现错误。

07-24 17:58