我试图从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混淆器,所以我对这个功能是否可以被利用感兴趣。
答案 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
结果。
yield
的历史记录作为保留字。
答案 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;
导致错误
FireFox中的SyntaxError:yield是保留标识符
并且在Chrome中允许使用,它取决于实现,或者,如果有任何标准,则不会遵循它。
答案 3 :(得分:0)
根据ECMAScript 2016 Language Specification,yield是一个关键字,所以不,它不是有效的标识符。
以下令牌是ECMAScript关键字,不能在ECMAScript程序中用作标识符。
语法
关键字::
之一在类型的情况下中断执行其他实例的var catch导出新的void类扩展返回而const最终超级继续为switch yield 调试器函数这个默认如果throw delete import尝试