Javascript中“new”关键字的限制

时间:2013-09-11 19:39:58

标签: javascript syntax

我有这个JS代码:

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

它适用于所有浏览器,但当我尝试使用obfuscator对其进行模糊处理时,会显示错误。

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

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

顺便说一句。怎么样?

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

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

4 个答案:

答案 0 :(得分:3)

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

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

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

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

Identifier :: IdentifierName but not ReservedWord

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

答案 1 :(得分:3)

是的,您的代码有效,混淆器错误(或旧)。 newreserved word,这意味着它不是有效的identifier(例如,用作变量名称)。然而,它仍然是IdentifierName,在object literalsdot-notation property access中有效。

但是,在EcmaScript 3中并非如此,both of these需要Identifiers,而new等关键字无效。因此,在Web上的脚本中使用这些名称时,这被认为是不好的做法,这些名称可能由旧浏览器执行。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

A['new'] = function(n) { return new Array(n); };