Ben*_*ier 0 javascript function new-operator
我想在ie8上建立一个网站.
我找到了以下js代码:
var autocompleteAddressController=(function(){
var my={};
//...
my.new=function(val){
//...
};
});
Run Code Online (Sandbox Code Playgroud)
在另一个文件中:
var address = autocompleteAddressController.new("#user_address_name");
//...
Run Code Online (Sandbox Code Playgroud)
这在最近的浏览器(铬和野生动物园)中工作正常
但它打破了ie8.我猜测ie8的javascript解析器不支持我们为自定义函数使用保留名称"new",所以在控制台中我有错误:expected identifier在那些表达式上:my.new=function和autocompleteAddressController.new.
new运算符还是仅仅在我的示例中使用的对象上创建一个函数?它会覆盖
new运营商吗?
不可以.您无法在JavaScript中覆盖运算符.
所有代码都是创建一个my恰好具有标识符的方法new.这在所有环境中都有效,但仅在ES5中通过点符号将保留字用作属性标识符才有效.您可以使用方括号使其在IE8和其他非ES5环境中工作:
my["new"] = function (val) { /*...*/ }
// And in your other file...
var address = autocompleteAddressController["new"]("#user_address_name");
Run Code Online (Sandbox Code Playgroud)
更新
稍微扩展一下,这里是ES5语法的相关部分.首先,这是标识符生产:
Identifier ::
IdentifierName但不是ReservedWord
请注意,标识符不能是保留字(new是保留字).所述IdentifierName生产直接指定了被允许在一个标识符(没有基于保留字限制)的字符.
这是" 对象初始化器 "(对象文字)中属性的语法:
PropertyName:
IdentifierName
StringLiteral
NumericLiteral
请注意,它引用IdentifierName而不是Identifier.这是允许使用保留字作为属性标识符的产品.
最后,将该产品与旧版ES3规范中的产品进行比较:
PropertyName:
Identifier
StringLiteral
NumericLiteral
这次,它使用Identifier,而不是IdentifierName.由于标识符生成不允许使用保留字,因此代码在ES3环境中无效.
| 归档时间: |
|
| 查看次数: |
885 次 |
| 最近记录: |