在尝试使用分配给'with'的对象时,我遇到了Aptana studio的问题:
var x = {};
x.with = 12;
这会产生语法错误:意外令牌'带'
代码位于我正在使用的外部库中,因此我不想更改代码,这不会导致IE或Chrome中的错误。
我尝试过使用偏好设置> Javascript语法验证器并添加规则,但我在编写正确的表达式时遇到问题。有没有人知道如何在不忽略真正错位的其他“有”事件的情况下关闭此错误?
我们非常感谢任何建议。
答案 0 :(得分:4)
这会产生语法错误:意外令牌'带'
那是因为 语法错误很长一段时间:这是ES3规范(1999)的语法错误,可能在此之前;从ES5开始(~2009;没有ES4),它不再是语法错误,但是一些仍在广泛使用的引擎早于该规范并且尚未(并且可能不会)更新(例如,IE8)
with
是一个关键字。该表达式(x.with
)是属性访问者,特别是使用文字属性名称的访问者。 ES3的定义要求名称为标识符,标识符是一个术语,规范给出了一个特定的定义:基本上它是遵循某些命名规则的名称一个保留字。因此with
不能用作标识符。要访问名称为保留字的属性,必须使用带括号的括号表示法:
x["with"] = 12;
从ES5开始,放宽了文字属性名称(§11.2.1)的规则。 (非常感谢Felix Kling指出这一点!)现在,他们只需要 IdentifierName ,而不是 Identifier 。区别? IdentifierName 符合命名规则; 标识符是标识符名称,它不是保留字。这包含在§7.6。
中哇这不是我依赖JavaScript实施者和工具构建器等的东西,如果我正在编写一个库,那么普遍正确。
我认为你唯一的办法是用Aptana打开一个bug报告,现在,按照下面的描述修改库。不理想。
更多关于我之前提到过的[]
符号:
x["with"] = 12;
在JavaScript中,您可以使用点分表示法和文字属性名称(x.foo
),或使用括号表示法和字符串属性名称(x["foo"]
)来访问属性。使用文字时,上述规则适用。但是,当使用字符串时,您可以执行任何您想要的操作(包括空格和 IdentifierNames 中不允许的其他字符)。
它也适用于对象初始化器:
var x = {
"with": 12
};
如果我正在编写一个库,或者需要在野外运行的任何代码,那就是我使用的。有一天我们将能够假设ES5兼容性,但那一天还没有到来。