我有这个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的作者写了一封电子邮件,他们修复了它! :)
答案 0 :(得分:3)
保留字可以用作属性标识符:
A.new = 1
B = { function: 123 }
D.if = { else: 5 }
等 - 这些都是有效的(不一定是好的)javascript。
这些东西在规范中称为“IdentifierName”,“IdentifierName”和常规标识符之间的唯一区别是
Identifier :: IdentifierName but not ReservedWord
答案 1 :(得分:3)
是的,您的代码有效,混淆器错误(或旧)。 new
是reserved word,这意味着它不是有效的identifier(例如,用作变量名称)。然而,它仍然是IdentifierName
,在object literals和dot-notation property access中有效。
但是,在EcmaScript 3中并非如此,both of these需要Identifier
s,而new
等关键字无效。因此,在Web上的脚本中使用这些名称时,这被认为是不好的做法,这些名称可能由旧浏览器执行。
答案 2 :(得分:0)
我没有看到任何错误。以点为首,它只是一个属性名称,就像['new']一样,不再是保留字。
答案 3 :(得分:0)
由于new
是保留字,因此它不能用作标识符,尽管它可以用作identifierName。请参阅ECMAScript规范的this section。所以你的代码是合法的,显然混淆器不理解这种区别。
要解决此问题,您可以使用数组样式表示法访问它:
A['new'] = function(n) { return new Array(n); };