Internet Explorer中的Javascript命名函数表达式
为什么以下代码在Internet Explorer中不起作用(到目前为止我只在IE8中测试过): 如果我将Internet Explorer中的Javascript命名函数表达式,javascript,internet-explorer,Javascript,Internet Explorer,为什么以下代码在Internet Explorer中不起作用(到目前为止我只在IE8中测试过): 如果我将foo的赋值更改为以下内容,则代码工作正常: var foo = this.foo = function(){}; 我想这与IE的Javascript引擎中的命名函数有关。该代码在Chrome和Firefox中运行良好 有什么想法吗?IE在命名函数表达式方面有很多问题。正如你在问题中所说的,坚持这一点: this.foo = function (){}; 要深入阅读这个主题,请查看 它的
foo
的赋值更改为以下内容,则代码工作正常:
var foo = this.foo = function(){};
我想这与IE的Javascript引擎中的命名函数有关。该代码在Chrome和Firefox中运行良好
有什么想法吗?IE在命名函数表达式方面有很多问题。正如你在问题中所说的,坚持这一点:
this.foo = function (){};
要深入阅读这个主题,请查看
它的缺点是,内部命名函数表达式被视为函数声明,并被提升到它永远不应该出现的地方。在IE中,使用
foo.prototype
是“含糊不清的”,因为NFE标识符泄漏到包含范围。
由于本地泄漏的foo比全局foo更接近,foo.prototype
扩充本地foo
,而不是窗口。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"
再详细一点——命名函数表达式实际上在IE中创建了两个不同的对象。参见中的示例#3,您不必因此而避免命名函数。根据经验,处理函数foo(){}的方法与处理var声明的方法相同,并且只在之后将其分配给任何属性。对于出于代码组织原因而希望使用NFE,但由于支持而无法使用的任何人,一种解决方法是在函数名通常出现的位置滑动带有函数名的注释。例如,
(function/*myFunctionName*/(){…}())代码>这使得以后可以很容易地用真实的东西替换,并且几乎同样可读。这看起来自2014年和IE8以来就没有更新过。IE10和IE11如何处理命名函数表达式?
(function(){
this.foo = function foo(){};
this.foo.prototype = {
bar:function(){
return 'bar';
}
};
})();
var x = new foo;
console.log(x.bar()) //"bar"