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

时间:2011-12-17 23:56:31

标签: 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

如果我将foo的分配更改为以下内容,则代码可以正常运行:

var foo = this.foo = function(){};

我想这与IE的Javascript引擎中的命名函数有关。该代码在Chrome和Firefox中运行良好。

有什么想法吗?

2 个答案:

答案 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"