我正在努力让网站在ie8上运作。
我找到了以下js代码:
var autocompleteAddressController=(function(){
var my={};
//...
my.new=function(val){
//...
};
});
在另一个档案中:
var address = autocompleteAddressController.new("#user_address_name");
//...
这在最近的浏览器(chrome和safari)中运行良好
但它打破了ie8。我猜测ie8的javascript解析器不支持我们为自定义函数使用保留名称“new”,所以在控制台中我对这些表达式有expected identifier
错误:my.new=function
和autocompleteAddressController.new
。
new
运算符,或者只是在对象上创建一个函数,就像我在我的示例中使用的一样?答案 0 :(得分:6)
是否会覆盖
new
运算符
没有。您无法在JavaScript中覆盖运算符。
所有代码都是创建my
的方法,恰好有标识符new
。这在所有环境中都有效,但仅在ES5中通过点符号将保留字用作属性标识符才有效。您可以使用方括号在IE8和其他非ES5环境中使用它:
my["new"] = function (val) { /*...*/ }
// And in your other file...
var address = autocompleteAddressController["new"]("#user_address_name");
<强>更新强>
稍微扩展一下,这里是ES5语法的相关部分。首先,这是Identifier production:
标识符 ::
IdentifierName 但不是 ReservedWord
请注意,标识符不能是保留字(new
是保留字)。 IdentifierName 生产只是指定标识符中允许的字符(没有基于保留字的限制)。
以下是“object initialisers”(对象文字)中属性的语法:
PropertyName :
IdentifierName
串文字
NumericLiteral
请注意,它引用 IdentifierName ,而不是 Identifier 。这是允许使用保留字作为属性标识符的制作。
最后,将该产品与older ES3 spec中的产品进行比较:
PropertyName :
标识符
串文字
NumericLiteral
这一次,它使用标识符,而不是 IdentifierName 。由于 Identifier 生产不允许使用保留字,因此ES3环境中的代码无效。