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
当前未在本规范中用作关键字。它是一个未来的保留字,留作将来语言扩展中的关键字使用。同样,
implements
、interface
、package
、private
、protected
和public
是严格模式代码中的未来保留字。
和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 - 包是保留关键字的主要内容,如果未能解决你的问题,请参考以下文章