【问题标题】:JavaScript - Is "yield" a proper identifier name in ES7JavaScript - 在 ES7 中“yield”是一个正确的标识符名称吗
【发布时间】:2017-05-19 21:46:14
【问题描述】:

我试图从 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 混淆器,所以我很想知道这个功能是否可以被利用。

【问题讨论】:

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


【解决方案1】:

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 的历史作为保留字。
  • ES3 在 7.5.2(当前)或 7.5.3(未来保留)中均未保留
  • ES5 作为未来保留字引入,要求在严格模式下作为标识符出错(第 7.6.1.2 节)
  • ES6 和 ES7 都在第 11.6.2.1 节中将 yield 声明为保留字,并注意在严格模式之外(第 12.1.1 节)允许用作标识符而不会出错

【讨论】:

  • @FelixKling 很公平,我添加了“一些”更多细节 :-)
【解决方案2】:

根据ES2015 spec

关键字

以下标记是 ECMAScript 关键字,不得用作 ECMAScript 程序中的标识符。

语法

关键字 :: 之一

breakdointypeofcaseelseinstanceofvar catchexportnewvoidclassextendsreturnwhile constfinallysuperwithcontinueforswitchyield debuggerfunctionthisdefaultifthrowdeleteimporttry

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

【讨论】:

  • 可能也值得引用 12.1.1。
【解决方案3】:

自代码

var yield;

导致错误

SyntaxError: yield 是一个保留标识符

在火狐中

它在 Chrome 中是允许的,它依赖于实现,或者,如果它有任何标准,它不会被遵循。

【讨论】:

    猜你喜欢
    • 2017-07-01
    • 2011-06-10
    • 2013-04-15
    • 2015-12-16
    • 2020-03-21
    • 2019-10-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    相关资源
    最近更新 更多