Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Internet Explorer中的Javascript命名函数表达式_Javascript_Internet Explorer - Fatal编程技术网

Internet Explorer中的Javascript命名函数表达式

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 (){}; 要深入阅读这个主题,请查看 它的

为什么以下代码在Internet Explorer中不起作用(到目前为止我只在IE8中测试过):

如果我将
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"