0

我正在尝试让一个网站在 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=functionautocompleteAddressController.new.

  • 你应该这样做吗?
  • 它会覆盖new运算符还是只是在对象上创建一个函数,就像我在示例中使用的那样?
4

1 回答 1

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 语法的相关部分。首先,这是标识符生产

标识符::
    IdentifierName但不是ReservedWord

请注意,标识符不能是保留字(new是保留字)。IdentifierName产生式只是指定标识符中允许的字符(没有基于保留字的限制)。

以下是“对象初始化器”(对象字面量)中属性的语法:

PropertyName :
    IdentifierName
    StringLiteral
    NumericLiteral

请注意,它指的是IdentifierName,而不是Identifier。这是允许使用保留字作为属性标识符的产品。

最后,将该产品与旧版 ES3 规范中的产品进行比较:

PropertyName :
    标识符
    StringLiteral
    NumericLiteral

这一次,它使用Identifier,而不是IdentifierName。由于标识符产品不允许使用保留字,因此代码在 ES3 环境中无效。

于 2013-04-12T08:51:36.200 回答