为什么以下代码在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
如果我将foo
的分配更改为以下内容,则代码可以正常运行:
var foo = this.foo = function(){};
我想这与IE的Javascript引擎中的命名函数有关。该代码在Chrome和Firefox中运行良好。
有什么想法吗?
答案 0 :(得分:8)
IE在命名函数表达式方面存在很多问题。正如你在问题中所说,坚持这一点:
this.foo = function (){};
有关此主题的深入,艰苦的阅读,请查看this link
缺点是内部命名函数表达式被视为函数声明,并被提升到它永远不应该存在的地方。
答案 1 :(得分:5)
在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"