JavaScript - 包是保留关键字

Posted

技术标签:

【中文标题】JavaScript - 包是保留关键字【英文标题】:JavaScript - package is a reserved keyword 【发布时间】:2012-01-24 01:17:33 【问题描述】:

我正在尝试使用 Google Closure Compiler 缩小第三方 javascript 库,但它在以下行出现错误:

inBlock.package = package = name

错误是

ERROR - 解析错误。后缺少名称。运营商**

name 上面是函数内部的局部变量,inBlock 是输入参数。除了该错误行之外,函数中没有任何地方声明 package

我猜可能是因为package 是 JavaScript 中的保留关键字? 知道 JavaScript 中的包是什么以及如何修复它吗?

【问题讨论】:

【参考方案1】:

你说得对,package 是 JavaScript 中的保留字(但仅限于严格模式,这就是代码在某些地方有效的原因)。

package 是未来保留的,这意味着它不用于任何事情,但你不能用它来命名变量。但是(如果您真的必须),您可以使用它来命名对象中的键,如下所示:

inBlock['package'] = name;  // this is ok

只要你使用字符串。你不能这样做:

inBlock.package = name;  // this is not ok

我会说你最好把它命名为别的。


对于那些想知道今天是否仍然如此的人 - package 在 ES-3 (1999) 中被添加到未来保留列表中,并且一直保留到今天。在撰写本文时,我们处于 ES-11 (2020),但仍无法使用。

ES-11 2020 spec的相关部分是:

11.6.2 Note 2:

enum 当前未在本规范中用作关键字。它是一个未来的保留字,留作将来语言扩展中的关键字使用。

同样,implementsinterfacepackageprivateprotectedpublic 是严格模式代码中的未来保留字。

和12.1.1 SS: Early Errors:

Identifier: IdentifierName 但不是ReservedWord

如果此短语包含在严格模式代码中并且 IdentifierName 的 StringValue 为:“implements”、“interface”、“let”、“package”、“@”,则为语法错误987654344@”、“protected”、“public”、“static”或“yield”。

【讨论】:

不过,您实际上并不需要使用括号语法。 jsFiddle@nnnnnn 这可能适用于某些解释器,但它是非法的(JavaScript:The Good Parts,第 103 页 - 如果您愿意,可以查看标准)。 哦,不知道。好吧,它至少适用于我能够测试的每个浏览器:) @minitech - 这就是为什么我说你可以“安全地使用”括号语法:它适用于任何地方,而点语法可能适用于大多数当前浏览器,但不要指望它未来……只是那些奇怪的“功能”中的另一个……【参考方案2】:

根据MDN,package 属于“为未来保留”类别。根据您使用的浏览器版本以及您的代码是否处于严格模式,您可能会也可能不会使用这些词作为标识符。换句话说,为了安全起见,您应该避免使用它们。

如果您使用以下语法,您可以安全地使用保留字作为属性名称:

inBlock["package"] = something;

但这对您的 package 变量没有帮助。可以改名吗?

【讨论】:

【参考方案3】:

package 是一个关键字(来自 Java),为以后可能在 JavaScript 中使用而保留。解决方案?将您的变量命名为其他名称:)

如果您无法更改 inBlock.package 的名称,请改用括号表示法访问它:

inBlock['package']

【讨论】:

【参考方案4】:

“package”是 ecmascript 3 中的保留字。ecmascript 5 减少了保留字集,使其对实现它的浏览器可用,并在 ecmascript 5“严格”模式下再次引入(这是未来的基础emcascript 修订版)。

Ecmascript 5 还改变了对保留字的限制,具体来说,您可以使用保留字作为属性名(无论模式如何),但不能使用变量名。

因此,如果您将 Closure Compiler 置于 EcmaScript 5 模式下,您可以使用“inBlock.package”,它不会报错,但如果您尝试在旧 IE 版本(8,7,6 I相信)它将无法解析。大多数其他浏览器没有遵循规范的这一部分,因此不受影响。

【讨论】:

以上是关于JavaScript - 包是保留关键字的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 保留关键字

Javascript 保留关键字

javascript基础 之 保留关键字

从零学Java之关键字和保留字,明世隐给AD定规矩!

JavaScript 标识符,关键字和保留字

JavaScript-Runoob:JavaScript 保留字