<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      kmdjs和循環(huán)依賴

      2016-06-13 18:26  【當(dāng)耐特】  閱讀(1087)  評論(0)    收藏  舉報

      循環(huán)依賴

      循環(huán)依賴是非常必要的,有的程序?qū)懼鴮懼脱h(huán)依賴了,可以提取出一個對象來共同依賴解決循環(huán)依賴,但是有時會破壞程序的邏輯自封閉和高內(nèi)聚。所以沒解決好循環(huán)依賴的模塊化庫、框架、編譯器都不是一個好庫、框架、編譯器。

      kmdjs的本質(zhì)就是{},從{}擴展出的tree。從很早的版本就開始,是支持循環(huán)依賴的。比如下面的代碼:

      define('namespace1.A',['namespace2'], {
          ctor: function () {
              this.b = new B();
          }
      })
      
      define('namespace2.B',['namespace1'] , {
          ctor: function () {
      
          },
          xx: function () {
              var a = new A();
          }
      })
      

      會被kmdjs編譯成:

      var namespace1 = {};
      var namespace2 = {};
      
      namespace1.A = Class.extend({
          ctor: function () {
              this.b = new namespace2.B();
          }
      })
      
      namespace2.B = Class.extend({
          ctor: function () {
      
          },
          xx: function () {
              var a = new namespace1.A();
          }
      })
      

      要支持循環(huán)依賴其實有個要求,就是lazy using不是lazy using的循環(huán)依賴是無解的循環(huán)依賴
      怎么理解上面這句話呢?看上面的代碼,Class.extend執(zhí)行完之后,各自依賴的東西是不會被調(diào)用的。
      A代碼里的new namespace2.B()要在new namespace1.A的時候才會被調(diào)用。
      B代碼里的new namespace1.A()要var a = new namespace1.A;a.xx()之后被調(diào)用后才會被執(zhí)行。
      所以在初始化階段,這樣的循環(huán)依賴是被允許的,因為都是lazy using。只要滿足lazy using,執(zhí)行順序就不重要了,如果不是lazy using(如靜態(tài)屬性方法的設(shè)置),執(zhí)行順序就必須把依賴的項先執(zhí)行。
      如上面所說,不是所有的循環(huán)依賴都能夠解決的,比如看C#里面的無解的循環(huán)依賴的例子:

      namespace Project1
      {
          public class A
          {
              public static B b = new B();
          }
      }
      
      namespace Project1
      {
          public class B
          {
              public static A a = new A();
          }
      }
      

      上面的代碼編譯時候就會報錯。怎么改成有解,那么就要lazy using:

      namespace Project1
      {
          public class A
          {
              public static B b = new B();
          }
      }
      
      namespace Project1
      {
          public class B
          {
              public int testMethod()
              {
                  A a = new A();
                  return 1;
              }
          }
      }
      

      這樣的依賴編譯器是可以解決的。

      kmdjs 0.1.4

      kmd的意思是 kernel module definition。該版本和以前的主要變化如下:

      1. kmdjs文件大小從以前的一萬多行代碼變成了一百多行代碼
      2. 從以前的namespace+class組織項目變成namespace+module組織項目

      kmdjs API

      kmdjs.config
      用于配置 namespace + module和文件路徑的mapping

      kmdjs.config({
          'util.bom':'js/util/bom.js',
          'app.Ball':'js/ball.js',
          'util.dom':'js/util/dom.js',
          'util.dom.test':'js/util/test.js',
          'main': 'js/main.js'
      });
      

      kmdjs.main
      程序的入口代碼。
      kmdjs.define
      定義模塊

      kmdjs.define('main',['util.bom','app.Ball','util.dom.test'], function(bom,Ball,test) {
      
          var ball = new Ball(0, 0, 28, 1, -2, 'kmdjs');
          alert(test.m(3, 3));
          var vp = bom.getViewport();
      
          setInterval(function () {
              ball.tick();
              (ball.x + ball.r * 2 > vp[2] || ball.x < 0) && (ball.vx *= -1);
              (ball.y + ball.r * 2 > vp[3] || ball.y < 0) && (ball.vy *= -1);
          }, 15);
      
      });
      

      如果只傳兩個參數(shù),代表不依賴任何模塊。這里和AMD一樣,在factory的回調(diào)里把依賴注入到里面。
      但是也直接在代碼里把namespace寫進去訪問,如下所示:

      kmdjs.define('main',['util.bom','app.Ball'], function() {
      
          var ball = new app.Ball(0, 0, 28, 1, -2, 'kmdjs');
          var vp = util.bom.getViewport();
      
          setInterval(function () {
              ball.tick();
              (ball.x + ball.r * 2 > vp[2] || ball.x < 0) && (ball.vx *= -1);
              (ball.y + ball.r * 2 > vp[3] || ball.y < 0) && (ball.vy *= -1);
          }, 15);
      
      });
      

      而有的時候必須使用上面這種方式用來解決循環(huán)依賴導(dǎo)致執(zhí)行順序問題帶來的注入undefined:如:

      kmdjs.define("util.dom",['util.bom'] ,function(bom){
          var Dom={};
      
          Dom.add = function(a,b){
              //循環(huán)依賴導(dǎo)致的bom undefined,所以這里寫上namespace
              return util.bom.sub(a,b);
          }
      
          return Dom;
      });
      

      kmdjs.define("util.bom",["util.dom"], function(dom){
          var Bom={};
      
          Bom.getViewport=function() {
              alert(dom.add(1,4));
            
          };
      
          Bom.sub = function(a,b){
              return a-b;
          };
          return Bom;
      });
      

      bundler

      可以通過main傳入回調(diào)函數(shù),在回調(diào)函數(shù)中拿到編輯打包好的字符串。

      kmdjs.main(function(bundler){
          alert(bundler)
      });
      

      如上面的例子打包出來的代碼:

      var util={};
      var app={};
      util.dom={};
      var main={};
      
      util.dom = (function (bom){
          var Dom={};
      
          Dom.add = function(a,b){
              return util.bom.sub(a,b);
          }
      
          return Dom;
      })(util.bom);
      
      app.Ball = (function (){
          var Ball = function (x, y, r, vx, vy, text) {
              this.x = x;
              this.y = y;
              this.r = r;
              this.d = 2 * r;
              this.vx = vx;
              this.vy = vy;
              this.element = document.createElement("div");
              this.element.innerHTML = text;
      
              this.element.style.cssText = "text-align:center;position:absolute; -moz-border-radius:" + this.d + "px; border-radius: " + this.d + "px; width: " + this.d + "px; height: " + this.d + "px;background-color:green;line-height:" + this.d + "px;color:white;";
              document.body.appendChild(this.element);
      
          };
      
          Ball.prototype.tick= function () {
              this.x += this.vx;
              this.y += this.vy;
              this.element.style.left = this.x + "px";
              this.element.style.top = this.y + "px";
          };
      
          return Ball;
      })();
      
      util.dom.test = (function (){
          var Element={};
      
          Element.m = function(a,b){
              return a*b;
          }
      
          return Element;
      })();
      
      util.bom = (function (dom){
          var Bom={};
      
          Bom.getViewport=function() {
              alert(dom.add(1,4));
              var d = document.documentElement, b = document.body, w = window, div = document.createElement("div");
              div.innerHTML = "  <div></div>";
              var lt = !(div.firstChild.nodeType === 3) ?
              { left: b.scrollLeft || d.scrollLeft, top: b.scrollTop || d.scrollTop } :
              { left: w.pageXOffset, top: w.pageYOffset };
              var wh = w.innerWidth ?
              { width: w.innerWidth, height: w.innerHeight } :
                  (d && d.clientWidth && d.clientWidth != 0 ?
                  { width: d.clientWidth, height: d.clientHeight } :
                  { width: b.clientWidth, height: b.clientHeight });
      
              return [lt.left, lt.top, wh.width, wh.height]
          };
      
          Bom.sub = function(a,b){
              return a-b;
          };
          return Bom;
      })(util.dom);
      
      main = (function (bom,Ball,test) {
      
          var ball = new Ball(0, 0, 28, 1, -2, 'kmdjs');
          alert(test.m(3, 3));
          var vp = bom.getViewport();
      
          setInterval(function () {
              ball.tick();
              (ball.x + ball.r * 2 > vp[2] || ball.x < 0) && (ball.vx *= -1);
              (ball.y + ball.r * 2 > vp[3] || ball.y < 0) && (ball.vy *= -1);
          }, 15);
      
      })(util.bom,app.Ball,util.dom.test);
      

      Github

      https://github.com/kmdjs/kmdjs

      主站蜘蛛池模板: 国产乱妇乱子视频在播放| 色爱综合另类图片av| 国产在线精品欧美日韩电影| 加勒比无码av中文字幕| 成人免费在线播放av| 无套内谢少妇一二三四| 金堂县| 少妇真人直播免费视频| 日韩丝袜亚洲国产欧美一区| 亚洲国产成人综合自在线| 精品亚洲欧美无人区乱码| 亚洲欧美偷国产日韩| 97午夜理论电影影院| 久久精品国产99久久久古代| 国产精品成人综合色在线| 亚洲一区二区约美女探花| 成人亚洲a片v一区二区三区动漫| 国产福利萌白酱在线观看视频| 另类 专区 欧美 制服| 日本欧美大码a在线观看| 无为县| 亚洲熟妇乱色一区二区三区| av男人的天堂在线观看国产 | 欧美一本大道香蕉综合视频 | 一区二区中文字幕av| 精品国产一区二区三区av性色| 久久精品女人的天堂av| 五月丁香六月综合缴情在线| 亚洲精品国产无套在线观| 女人被狂躁c到高潮| 国产精品久久毛片| 久久精品蜜芽亚洲国产AV| 亚洲综合一区国产精品| 嫩草研究院久久久精品| 亚洲欧洲国产综合aⅴ无码| 国产精品视频一区二区亚瑟| 亚洲国产精品美日韩久久| 成人网站国产在线视频内射视频 | 国产精品自拍视频免费看| 少妇人妻偷人精品视蜜桃| 国产人妻大战黑人第1集|