Javascript Named Function Expressions in Internet Explorer
为什么下面的代码在Internet Explorer中不起作用(到目前为止我只在IE8中测试过):
1 2 3 4 5 6 7 8 9 10 11 12 | (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 |
如果我将
1 | var foo = this.foo = function(){}; |
我想这与IE的Javascript引擎中的命名函数有关。 该代码在Chrome和Firefox中运行良好。
有任何想法吗?
IE在命名函数表达式方面存在很多问题。 正如你在问题中所说,坚持这样:
1 | this.foo = function (){}; |
有关此主题的深入,艰苦的阅读,请查看此链接
缺点是内部的,命名的函数表达式被视为一个函数声明,并被提升到它永远不应该的地方。
在IE中,
由于本地泄露的foo比全局foo更接近,
增加本地
离开外部函数后,本地
由于上述原因。
您可以通过以下方式解决歧义:
1 2 3 4 5 6 7 8 9 10 11 12 | (function(){ this.foo = function foo(){}; this.foo.prototype = { bar:function(){ return 'bar'; } }; })(); var x = new foo; console.log(x.bar()) //"bar" |