mik*_*gto 4 javascript internet-explorer
为什么下面的代码在Internet Explorer中不起作用(到目前为止我只在IE8中测试过):
(function(){
this.foo = function foo(){};
foo.prototype = {
bar:function(){
return 'bar';
}
};
})();
var x = new foo;
console.log(x.bar()) // Error: Object doesn't support this property or method
Run Code Online (Sandbox Code Playgroud)
如果我将foo分配更改为以下内容,则代码可以正常工作:
var foo = this.foo = function(){};
Run Code Online (Sandbox Code Playgroud)
我想这与IE的Javascript引擎中的命名函数有关.该代码在Chrome和Firefox中运行良好.
有任何想法吗?
IE在命名函数表达式方面存在很多问题.正如你在问题中所说,坚持这样:
this.foo = function (){};
Run Code Online (Sandbox Code Playgroud)
有关此主题的深入,艰苦的阅读,请查看此链接
缺点是内部的,命名的函数表达式被视为一个函数声明,并被提升到它永远不应该的地方.
在IE中,使用foo.prototype是"ambigious",因为NFE标识符泄漏到包含范围.由于当地泄露的foo比全球foo更接近,所以foo.prototype会扩大本地foo,而不是window.foo.
当您离开外部函数,局部foo损失和全球foo没有.prototype.bar
因上述原因.
您可以通过以下方式解决歧义:
(function(){
this.foo = function foo(){};
this.foo.prototype = {
bar:function(){
return 'bar';
}
};
})();
var x = new foo;
console.log(x.bar()) //"bar"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1944 次 |
| 最近记录: |