【问题标题】:Using keywords as object key throws syntax error in Aptana在 Aptana 中使用关键字作为对象键会引发语法错误
【发布时间】:2013-05-29 09:01:04
【问题描述】:

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

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

这会产生语法错误:意外的标记 'with'

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

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

任何建议将不胜感激。

【问题讨论】:

  • 你总是可以用 x['with'] 代替...

标签: javascript aptana


【解决方案1】:

这会产生语法错误:意外的标记 'with'

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

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

x["with"] = 12;

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

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

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


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

x["with"] = 12;

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

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

var x = {
    "with": 12
};

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

【讨论】:

  • 不是语法错误。 Chrome 和 Firefox 都不会抛出错误。属性名称可以是任何有效的标识符名称,不排除保留关键字。请参阅es5.github.io/#x11.2.1es5.github.io/#x11.1.5es5.github.io/#x7.6
  • @FelixKling:我会的!你是对的,它在§11.2.1§7.6 中这么说。 编辑 哈哈!当我查找并回复时,您正在编辑您的评论! :-)
  • @Andreas:哈哈!所以你不熟悉整个with 争议! :-) 是的,这是一个保留字。事实上,它是一个活跃的关键字。 var o = {x: 15}; with (o) { console.log(x); }15 记录到控制台。它是 JavaScript 中使用最少的部分之一,尤其是因为很难判断发生了什么。事实上,它在 ES5 的严格模式下被禁用了。
  • 不客气!无论如何,我同意你的看法。即使根据规范它是有效的,我也不会依赖它在每个环境中工作。
  • @FelixKling 啊哈!感谢您的信息!
猜你喜欢
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多