JavaScript - 是"产量" ES7中的正确标识符名称

时间:2017-05-19 21:46:15

标签: javascript google-chrome firefox gecko ecmascript-7

我试图从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错误?

P.S。我之所以这样问,是因为我正在编写一个JavaScript混淆器,所以我对这个功能是否可以被利用感兴趣。

4 个答案:

答案 0 :(得分:4)

yield是ES7中的保留字。但是在该语言的过时 1 版本中允许使用它。因此禁止使用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节)

答案 1 :(得分:1)

根据 ES2015 spec

  

<强>关键字

     

以下令牌是ECMAScript关键字,不能用作   ECMAScript程序中的标识符。

     

语法

     

关键字::

之一      

break do in typeof case else instanceof var   catch export new void class extends return while   const finally super with continue for switch yield   debugger function this default if throw delete import try

     

注意:在某些情况下,yield会给出标识符的语义。看到   12.1.1。在严格模式代码中,let和static通过静态语义限制被视为保留关键字(见12.1.1,13.3.1.1,   13.7.5.1和14.5.1)而不是词汇语法。

答案 2 :(得分:0)

的代码
var yield;

导致错误

  

SyntaxError:yield是保留标识符

FireFox中的

并且在Chrome中允许使用,它取决于实现,或者,如果有任何标准,则不会遵循它。

答案 3 :(得分:0)

根据ECMAScript 2016 Language Specification,yield是一个关键字,所以不,它不是有效的标识符。

  

以下令牌是ECMAScript关键字,不能在ECMAScript程序中用作标识符。

     

语法

     

关键字::

之一      

在类型的情况下中断执行其他实例的var catch导出新的void类扩展返回而const最终超级继续为switch yield 调试器函数这个默认如果throw delete import尝试