3

我有这个JS代码:

var A = {};
A.new = function(n) { return new Array(n); }

它在所有浏览器中都运行良好,但是当我尝试使用 obfuscator 对其进行混淆时,它会显示错误。

它是有效的 JS 代码吗?我查看了规范,但没有找到任何东西。我知道,浏览器有时会接受语法错误的代码,但我想编写语法正确的代码。

请注意,我没有做var new = ...

顺便提一句。那这个呢?

var a = { "new" : 2 };  // ok?
a.new    = 3;           // ok?
a["new"] = 3;           // ok?

.

编辑:谢谢大家的帮助!我给混淆器的作者写了一封电子邮件,他们修复了它!:)

4

4 回答 4

3

保留字可用作属性标识符:

A.new = 1
B = { function: 123 }
D.if = { else: 5 }

等等 - 这都是有效的(不一定是好的)javascript。

这些东西在规范中称为“IdentifierName”,“IdentifierName”和常规 Identifier 之间的唯一区别是

Identifier :: IdentifierName but not ReservedWord

http://es5.github.io/#x7.6

于 2013-09-11T19:50:56.737 回答
3

是的,您的代码是有效的,但混淆器是错误的(或旧的)。new是一个保留字,这意味着它不是一个有效的标识符(例如用作变量名)。然而,它在对象文字点符号属性访问中仍然IdentifierName是有效的。

然而,在 EcmaScript 3 中情况并非如此,这两个都 需要Identifiers,并且关键字 likenew是无效的。因此,在 Web 上的脚本中使用这些未引用的名称被认为是一种不好的做法,这些名称可能由旧版浏览器执行。

于 2013-09-11T19:54:17.350 回答
0

我没有看到任何错误。以点开头,它只是一个属性名称,就像 ['new'] 一样,不再是保留字。

于 2013-09-11T19:44:12.583 回答
0

由于new是一个保留字,它不能用作标识符,尽管它可以用作标识符名称。请参阅ECMAScript 规范的这一部分。所以你的代码是合法的,显然混淆器不理解这种区别。

要解决此问题,您可以使用数组样式表示法访问它:

A['new'] = function(n) { return new Array(n); };
于 2013-09-11T19:47:31.780 回答