шаблон модуля javascript, поддерживающий взаимозависимость - PullRequest
3 голосов
/ 20 января 2011

Кажется, что при использовании следующего шаблона модуля javascript невозможно иметь взаимозависимые модули:

var AA = (function(module, BB){
  module.sayHello = function(){
    alert("AA: hello!");
  };
  module.pokeYourFriend = function(){
    BB.sayHello();
  };
  return module;
})(AA || {}, BB);

var BB = (function(module, AA){
  module.sayHello = function(){
    alert("BB: hello!");
  };
  module.pokeYourFriend = function(){
    AA.sayHello();
  };
  return module;
})(BB || {}, AA);


> AA.pokeYourFriend();
*TypeError: Cannot call method 'sayHello' of undefined*

вышеописанное не выполняется, поскольку BB не существует во время создания AA.

Есть шаблон, который позволяет это, или взаимная зависимость должна быть запрещена?

1 Ответ

2 голосов
/ 20 января 2011

Значения RHS AA и BB являются функциональными выражениями, которые оцениваются в порядке сверху вниз (что является нормальным порядком в Javascript).Следовательно, вы не можете использовать BB до того, как будет определено BB.

Вместо самостоятельного вызова вы можете использовать «конструктор», который создает эти модули и присваивает им имя («AA»,или "BB"):

var create = (function(name) {
   var _friend = null;
   var _name = name;

   return {
      sayHello: function() {
         alert(_name + ": hello!");
      },
      pokeYourFriend: function() {
         if(_friend != null) {
            _friend.sayHello();
         }
      },
      setFriend: function(friend) {
         _friend = friend;
      }
   };
});

var AA = create("AA");
var BB = create("BB");

AA.setFriend(BB);
BB.setFriend(AA);

AA.pokeYourFriend(); //alerts "BB: hello!"
BB.pokeYourFriend(); //alerts "AA: hello!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...