JavaScript - package是一个保留关键字

19

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

inBlock.package = package = name

错误是

 

ERROR - 解析错误。在.运算符后缺少名称**

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

我猜这可能是因为package是JavaScript中的保留关键字? 有没有想法解决JavaScript中package的问题?

4个回答

25

你说得没错,package 是 JavaScript 中的保留字(但只有在严格模式下才是,这就是为什么代码在某些地方能正常工作的原因)。

package 是未来保留的,这意味着它目前没有被用于任何事情,但你不能用它来命名变量。不过(如果你真的必须这样做),你可以像这样使用它来命名对象中的键:

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

只要您使用字符串,就不能这样做:
inBlock.package = name;  // this is not ok

我认为你最好把它命名为其他名称。
对于那些想知道这是否仍然适用的人们 - 在ES-3(1999年)中将package添加到未来保留列表中,一直保持至今天。在撰写本文时,我们处于ES-11(2020年),其中仍无法使用。 ES-11 2020规范的相关部分如下: 11.6.2 注意2

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

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

12.1.1 静态语义:早期错误

Identifier: IdentifierName但不包括ReservedWord

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


你其实不一定需要使用括号语法。jsFiddle @nnnnnn - Ry-
这在一些解释器中可能有效,但是它是非法的(JavaScript: The Good Parts,第103页 - 如果您愿意,可以查找标准)。 - Timothy Jones
哦,不知道呢。嗯,至少在我能测试的每个浏览器中都可以工作 :) - Ry-
@minitech - 这就是我说你可以“安全使用”括号语法的原因:它在任何地方都能工作,而点语法可能在大多数当前浏览器中工作,但不要指望它在未来也能这样...只是另一个那些小怪异“特性”之一... - nnnnnn

2
“package”是ECMAScript 3中的保留字。ECMAScript 5减少了保留字集合,使得这个保留字可以在实现它的浏览器中使用,并在ECMAScript 5“严格模式”中再次引入(这将成为未来ECMAScript修订的基础)。
ECMAScript 5还改变了对保留字的限制,具体来说,您可以将保留字用作属性名称(无论模式如何),但不可以用作变量名称。
因此,如果您将Closure Compiler设置为EcmaScript 5模式,则可以使用“inBlock.package”,并且不会出现错误,但如果您尝试在旧版IE版本(我相信是8、7、6)中使用它,则会解析失败。大多数其他浏览器没有遵循规范的这一部分,因此不受影响。

2

package 是 Java 中的关键字,为了以后在 JavaScript 中可能的使用而保留。解决方案是:给你的变量起一个别的名字 :)

如果你不能改变 inBlock.package 的名称,请使用方括号表示法来访问它:

inBlock['package']

2
根据 MDNpackage 属于“保留供将来使用”的类别。取决于您使用的浏览器版本以及您的代码是否处于严格模式,您可能无法将这些单词用作标识符。换句话说,为了安全起见,您应该避免使用它们。
如果使用以下语法,则可以安全地将保留字用作属性名:

You can safely use reserved words as property names if you use this syntax:

inBlock["package"] = something;

但这并不能帮助你处理你的package变量。你能给它改个名字吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接