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

发布于 2024-10-13 05:01:15 字数 601 浏览 3 评论 0原文

看来使用以下 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 时不存在。

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

It seems that using the following javascript module pattern, it is not possible to have mutually dependent modules:

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*

the above fails because BB does not exist at the time AA is created.

is there a pattern that allows this, or should mutual dependency be forbidden?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

醉梦枕江山 2024-10-20 05:01:16

AABB 的 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!"

The RHS values of AA and BB are function expressions, which are evaluated in top-down order (which is the normal order in Javascript). Therefore, you cannot use BB before BB has been defined.

Instead of self-invoking, you can use a "constructor" that creates these modules and assigns a name to them ("AA", or "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!"
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文