Выражения именованных функций Javascript в Internet Explorer - PullRequest
4 голосов
/ 18 декабря 2011

Почему следующий код не работает в 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(){};

Я предполагаю, что это связано с именованными функциями в движке Javascript IE. Код прекрасно работает в Chrome и Firefox.

Есть идеи?

Ответы [ 2 ]

8 голосов
/ 18 декабря 2011

В IE много проблем с выражениями именованных функций.Как вы сказали в своем вопросе, придерживайтесь этого:

this.foo = function (){};

Для углубленного, изнурительного прочтения по этой теме, прочитайте эту ссылку

Краткоеиз этого следует, что внутреннее, именованное выражение функции рассматривается как функция объявление и поднимается до тех мест, где оно никогда не должно быть.

5 голосов
/ 18 декабря 2011

В IE использование foo.prototype является «неоднозначным», потому что идентификаторы NFE просочились в содержащую область.Так как локальная утечка foo ближе, чем глобальная foo, foo.prototype будет увеличивать локальную foo, а не window.foo.

. После выхода из внешней функции локальная foo будет потеряна иglobal foo не имеет .prototype.bar по указанным выше причинам.

Вы можете устранить неоднозначность следующим образом:

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

  this.foo.prototype = {
    bar:function(){
      return 'bar';
    }
  };
})();

var x = new foo;
console.log(x.bar()) //"bar"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...