国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

kmdjs和循環(huán)依賴

AlienZHOU / 1195人閱讀

摘要:從很早的版本就開始,是支持循環(huán)依賴的。比如下面的代碼會(huì)被編譯成要支持循環(huán)依賴其實(shí)有個(gè)要求,就是。不是的循環(huán)依賴是無解的循環(huán)依賴。所以在初始化階段,這樣的循環(huán)依賴是被允許的,因?yàn)槎际恰?/p>

循環(huán)依賴

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

kmdjs的本質(zhì)就是{},從{}擴(kuò)展出的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();
    }
})

會(huì)被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)依賴其實(shí)有個(gè)要求,就是lazy using不是lazy using的循環(huán)依賴是無解的循環(huán)依賴
怎么理解上面這句話呢?看上面的代碼,Class.extend執(zhí)行完之后,各自依賴的東西是不會(huì)被調(diào)用的。
A代碼里的new namespace2.B()要在new namespace1.A的時(shí)候才會(huì)被調(diào)用。
B代碼里的new namespace1.A()要var a = new namespace1.A;a.xx()之后被調(diào)用后才會(huì)被執(zhí)行。
所以在初始化階段,這樣的循環(huán)依賴是被允許的,因?yàn)槎际?strong>lazy using。只要滿足lazy using,執(zhí)行順序就不重要了,如果不是lazy using(如靜態(tài)屬性方法的設(shè)置),執(zhí)行順序就必須把依賴的項(xiàng)先執(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();
    }
}

上面的代碼編譯時(shí)候就會(huì)報(bào)錯(cuò)。怎么改成有解,那么就要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。該版本和以前的主要變化如下:

kmdjs文件大小從以前的一萬多行代碼變成了一百多行代碼

從以前的namespace+class組織項(xiàng)目變成namespace+module組織項(xiàng)目

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);

});

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

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);

});

而有的時(shí)候必須使用上面這種方式用來解決循環(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 = "  
"; 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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/79656.html

相關(guān)文章

  • kmdjs集成uglifyjs2打造極致的編程體驗(yàn)

    摘要:怎樣才算更好不用依賴注入不用寫,自動(dòng)匹配依賴如下所示這就要借助能力,把的字符串替換成帶有就可以實(shí)現(xiàn)上面的效果。再也不用區(qū)分循環(huán)依賴和非循環(huán)依賴了上面的所有代碼可以上找到 回顧 上篇文章大概展示了kmdjs0.1.x時(shí)期的編程范式:如下面所示,可以直接依賴注入到function里, kmdjs.define(main,[util.bom,app.Ball,util.dom.test], ...

    Pink 評(píng)論0 收藏0
  • 用 Vue 來觀察屬性變化

    摘要:創(chuàng)建實(shí)例時(shí),將遍歷的屬性,通過的將它們轉(zhuǎn)為,在其內(nèi)部可以追蹤依賴通知變化。在內(nèi)部,同是響應(yīng)的觀察屬性變化的實(shí)例提供了方法,用于觀察屬性變化。 響應(yīng)系統(tǒng)是 Vue 一個(gè)顯著功能,修改屬性,可以更新視圖,這讓狀態(tài)管理變得非常簡(jiǎn)單且直觀。創(chuàng)建 Vue 實(shí)例時(shí),Vue 將遍歷 data 的屬性,通過 ES5 的 Object.defineProperty 將它們轉(zhuǎn)為 getter/setter...

    hot_pot_Leo 評(píng)論0 收藏0
  • Qone 正式開源,使 javascript 支持 .NET LINQ

    摘要:下一代查詢語言,使支持緣由最近剛好修改了騰訊文檔表格公式的一些,主要是修改公式的。總的來說,因?yàn)轵v訊文檔公式相關(guān)工作早年的開發(fā)和開發(fā),所以有了。讓前端工程師通過字符串的形式實(shí)現(xiàn)了的調(diào)用下面統(tǒng)一叫做,即組成的。多數(shù)據(jù)源多數(shù)據(jù)源會(huì)產(chǎn)生笛卡兒積。 Qone 下一代 Web 查詢語言,使 javascript 支持 LINQ Github: https://github.com/dntzha...

    JinB 評(píng)論0 收藏0
  • Spring源碼分析:Spring的循環(huán)依賴分析

    摘要:我們知道為我們完全實(shí)例化好一個(gè)一定會(huì)經(jīng)過一下三步實(shí)例化,其實(shí)也就是調(diào)用對(duì)象的構(gòu)造方法實(shí)例化對(duì)象。循環(huán)依賴的產(chǎn)生定會(huì)發(fā)生在步驟和中,因?yàn)槭抢脴?gòu)造方法,是利用屬性賦值。 引言 基于Spring5+ 什么是循環(huán)依賴? 循環(huán)依賴有幾種? Spring可以解決哪幾種,為什么不能解決這幾種? Spring是如何判斷存在循環(huán)依賴的? 什么是循環(huán)依賴? 什么是循環(huán)依賴?我們都知道Spring最大...

    Cheng_Gang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<