3

在Javascript中有各种不能在里面使用的保留字Identifiers;其中一些实际上是为将来使用而保留的。为了澄清一点, anIdentifier是一个Identifier Name但不是保留字。标识符名称的确切语法在这里不相关。

但是,根据此处的最后一段,似乎在某些地方使用 any 是有效的Identifier Name,即使它是保留字。文章提到有效

a.import
a["import"]
a = { import: "test" }

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

事实上,这个资源表示

foo.if

作为无效代码。

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

作为一个动机,我正在编写一个 API,在其中传递表单的对象是有意义的

{
    in: foo,
    out: bar
}

但我不想强迫用户在in.

4

4 回答 4

5

这是 ECMA-262 第 3 版和第 5 版之间的更改(您可以在此处获取)。

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

Identifier ::
    IdentifierName but not ReservedWord

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

MemberExpression . Identifier
CallExpression . Identifier

在第 3 版到

MemberExpression . IdentifierName
CallExpression . IdentifierName

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

我不知道是否只是因为对Identifier的限制在语法上是不必要的,因为没有一个保留字可以合法地遵循 a .,或者它是否也编纂了各种实现的现有实践,所以进行了这种更改。

PS:经过一番挖掘,我在第5 版项目编辑Allen Wirfs-Brock 的邮件中发现了以下内容:

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

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

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

于 2011-11-11T21:31:32.030 回答
1

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

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

var d = {
    'in': 1
};

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

第 2 行字符 5 处的问题:需要一个标识符,但看到的是“in”(保留字)。

于 2011-11-11T20:06:18.437 回答
1

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

于 2011-11-11T20:42:21.897 回答
1

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

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

于 2011-11-11T21:06:21.097 回答