在Javascript中使用保留字

时间:2011-11-11 20:01:13

标签: javascript identifier ecma262

在Javascript中,有Identifiersreserved words无法在Identifier内使用;其中一些实际上留作将来使用。为了澄清一点,Identifier NameIdentifier Name但不是保留字。标识符名称的确切语法与此无关。

根据the last paragraph here,似乎有一些地方可以使用任何a.import a["import"] a = { import: "test" } ,即使它是保留字。文章提到有效

foo.if

虽然我很清楚第二种形式是合法的,但我一直认为第一种形式和第三种形式都不合法。

事实上,this resource表示

{
    in: foo,
    out: bar
}

作为无效代码。

  

有些地方的保留字实际上是否有效?

作为一种动机,我正在编写一个API来传递表单

的对象是有意义的
in

但我不想强迫用户在{{1}}附近添加括号。

4 个答案:

答案 0 :(得分:5)

这是第3版和第5版之间ECMA-262的更改(您可以get here)。

在两个版本中,第7.6节将标识符定义为

Identifier ::
    IdentifierName but not ReservedWord

但是,在第11.2.1节中,使用点表示法的属性访问器已从

更改
MemberExpression . Identifier
CallExpression . Identifier

在第3版

MemberExpression . IdentifierName
CallExpression . IdentifierName
第5版中的

,即使用保留名称作为点访问器确实是合法的现在

我不知道是否因为对 Identifier 的限制在语法上是不必要的,因为没有一个保留字可以合法地跟随.,或者它也是编纂了各种实施的现有做法。

PS:经过一番挖掘后,我在版本5的mail from Allen Wirfs-Brock项目编辑器中找到了以下内容:

  

ES3语法不允许将保留字(例如true和false)用作PropertyName或MemberExpression中句点的右侧。您的测试验证大多数实现符合该限制,而FF具有“非标准”扩展,允许在这些上下文中使用保留字(或至少您测试的那些)。

     

ES3.1故意采用FF扩展作为语言的标准部分,因此当其他实现最终更新为支持ES3.1时,它们不应该长时间报告您的测试用例错误。

请注意,ECMAScript 3.1是现在称为ECMAScript 5的原始名称。

答案 1 :(得分:1)

虽然大多数浏览器都不会在a.import处抛出错误,但它并不严格合法。如果你想使用保留字,你必须引用它。

访问http://wwwjslint.com,然后粘贴以下代码:

var d = {
    'in': 1
};

此代码有效。但是,当您删除引号时,会生成错误:

  

第2行第5个问题:预期标识符,而是看到'in'(保留字)。

答案 2 :(得分:1)

MDN文章引用了Firefox符合的Ecmascript 5规范,但并非所有浏览器都以这种方式符合它,即所有浏览器都不符合Ecmascript 5。

答案 3 :(得分:1)

如果没有引用,你不能依赖它们在所有浏览器/实现上工作。

如果有意义,我会尝试将它们更改为“输入”和“输出”之类的东西。您必须在文档中添加关于“in”需要引号的额外句子可能不值得拥有“完美”标识符名称。