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

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

如果我将foo的赋值更改为以下内容,则代码可以正常工作:

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

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

有任何想法吗?


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

1
this.foo = function (){};

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

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


在IE中,foo.prototype的使用是"ambigious",因为NFE标识符泄漏到包含范围。
由于本地泄露的foo比全局foo更接近,foo.prototype
增加本地foo,而不是window.foo

离开外部函数后,本地foo丢失,全局foo没有.prototype.bar
由于上述原因。

您可以通过以下方式解决歧义:

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"