2

在尝试使用分配给“with”的对象时,我遇到了 Aptana studio 的问题:

var x = {};
x.with = 12;

这会产生语法错误:意外标记“with”

该代码位于我正在使用的外部库中,因此我宁愿不更改代码,这不会导致 IE 或 Chrome 中的错误。

我尝试使用 Preferences > Javascript Syntax Validator 并添加规则,但我无法编写正确的表达式。有谁知道在不忽略其他真正错位的“与”事件的情况下关闭此错误的方法?

任何建议将不胜感激。

4

1 回答 1

4

这会产生语法错误:意外标记“with”

那是因为长期以来它一个语法错误:根据 ES3 规范(1999),这是一个语法错误,并且可能在此之前;从 ES5(约 2009 年;没有 ES4)开始,它不再是语法错误,但一些引擎仍然在该规范之前广泛使用,并且尚未(并且可能不会)更新(例如 IE8) .

with是一个关键字。该表达式 ( x.with) 是一个属性访问器,特别是一个使用文字属性名称的访问器。那些的 ES3 定义要求名称是IdentifierIdentifier是规范给出的特定定义的术语:基本上它是遵循某些命名规则的名称,而不是保留字。所以with不能用作Identifier。要访问名称为保留字的属性,您必须使用带括号的符号和字符串:

x["with"] = 12;

从 ES5 开始,文字属性名称(第 11.2.1 节)的规则被放宽了。(非常感谢 Felix Kling 指出这一点!)现在,它们只需要是IdentifierName,而不是Identifier。区别?IdentifierName是符合命名规则的东西;标识符是不是保留字的标识符名称。§7.6 对此进行了介绍。

,我不会依赖 JavaScript 实现者和工具构建者等,如果我正在编写一个库,那么这一切都是正确的。

我认为你唯一的办法是用 Aptana 打开一个错误报告,现在,如下所述修改库。不理想。


更多关于[]我之前提到的符号:

x["with"] = 12;

在 JavaScript 中,您可以使用点分表示法和文字属性名称 ( x.foo) 或使用括号表示法和字符串属性名称 ( x["foo"]) 来访问属性。使用文字时,适用上述规则。但是,当使用string时,您几乎可以做任何您想做的事情(包括空格和IdentifierNames中不允许的其他字符)。

它也适用于对象初始化器:

var x = {
    "with": 12
};

如果我正在编写一个库或任何需要在野外运行的代码,这就是我会使用的。总有一天我们可以假设 ES5 兼容,但那一天还没有到来。

于 2013-05-29T09:03:41.733 回答