Javascript在Internet Explorer中命名为函数表达式

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中运行良好.

有任何想法吗?

Ada*_*kis 8

IE在命名函数表达式方面存在很多问题.正如你在问题中所说,坚持这样:

this.foo = function (){};
Run Code Online (Sandbox Code Playgroud)

有关此主题的深入,艰苦的阅读,请查看此链接

缺点是内部的,命名的函数表达式被视为一个函数声明,并被提升到它永远不应该的地方.

  • 只是为了添加更多细节 - 命名函数表达式实际上在IE中创建了两个不同的对象.请参阅http://kangax.github.com/nfe/#jscript-bugs中的示例#3 (3认同)

Esa*_*ija 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"
Run Code Online (Sandbox Code Playgroud)