Javascript中“new”关键字的限制

Restriction of "new" keyword in Javascript

本文关键字:关键字 new Javascript      更新时间:2023-09-26

我有这个JS代码:

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

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

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

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

顺便说一句,这个呢?

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

.

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

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

然而,在 EcmaScript 3 中并非如此,在

EcmaScript 3 中,这两个都需要Identifier,而像 new 这样的关键字是无效的。因此,在 Web 上的脚本中使用这些未引用的名称被认为是不好的做法,这些脚本可能由较旧的浏览器执行。

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

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

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

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

Identifier :: IdentifierName but not ReservedWord

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

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

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

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

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