Expressions de fonctions nommées par Javascript dans Internet Explorer

Pourquoi le code suivant ne fonctionne-t-il pas dans Internet Explorer (je n'ai testé que dans IE8 jusqu'à présent):

(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 

Si je change l'assignation de foo à ce qui suit, le code fonctionne très bien:

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

J'imagine qu'il s'agit de fonctions nommées dans le moteur de JavaScript d'IE. Le code fonctionne bien dans Chrome et Firefox.

Des idées?

IE a beaucoup de problèmes avec les expressions de fonctions nommées. Comme vous l'avez dit dans votre question, respectez ceci:

 this.foo = function (){}; 

Pour une lecture approfondie et épuisante sur ce sujet, consultez ce lien

Au bout de quoi, l'expression de la fonction nommée intérieure est traitée comme une déclaration de fonction, et est hissée jusqu'à des endroits où elle ne devrait jamais être jamais.

Dans IE, l'utilisation de foo.prototype est "ambigieuse" car les identifiants NFE sont divulgués dans la portée contenant. Étant donné que le foo local filtré est plus proche que le foo mondial, foo.prototype augmentera le foo local, pas window.foo .

Après avoir quitté la fonction extérieure, le local foo est perdu et le foo global n'a pas .prototype.bar pour les raisons ci-dessus.

Vous pouvez résoudre l'ambiguïté en:

 (function(){ this.foo = function foo(){}; this.foo.prototype = { bar:function(){ return 'bar'; } }; })(); var x = new foo; console.log(x.bar()) //"bar"