Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
支持相互依赖的javascript模块模式_Javascript_Design Patterns - Fatal编程技术网

支持相互依赖的javascript模块模式

支持相互依赖的javascript模块模式,javascript,design-patterns,Javascript,Design Patterns,似乎使用以下javascript模块模式,不可能有相互依赖的模块: var AA = (function(module, BB){ module.sayHello = function(){ alert("AA: hello!"); }; module.pokeYourFriend = function(){ BB.sayHello(); }; return module; })(AA || {}, BB); var BB = (function(modul

似乎使用以下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*
上述操作失败,因为在创建AA时BB不存在


是否有一种模式允许这样做,或者应该禁止相互依赖?

AA和
BB
的RHS值是函数表达式,按自上而下的顺序计算(这是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!"