首先第一段:
var obj = arguments[0], flow = }, flowdata = {}, noop = function(){}, init = 'init', trace = flowjs.trace = flowjs.trace||[init];這段**就是把要用到的變數在開始宣告用逗號隔開,為了**的整潔和節省**的語句數量。
第二段:
if(({}).tostring.call(obj) === '[object object]'), stepdata:function(dataname);讀到extend(flow,obj);我們應該猜到是將引數和flow合併,我們在來看extend方法:}, getprev:noop, fail:noop, success:noop}, new step(init)));
}
function prop(obj, fun)extend的方法是將src的原生屬性新增到des物件中。然後我們接著主線看:}/*物件的合併擴充套件*/
function extend(des, src));
return des;
}
flow.init.call(extend(, stepdata:function(dataname);這段**就是要執行引數中的init方法並且將乙個自定義新增step(init)返回的物件中的屬性的物件作為init中的this物件。那重點在step方法,但由於裡面有點複雜剛開始接觸你看不到他在裡什麼的各種方法的用處,在這裡我們最後結合《乙個只有99行**的js流程框架》文章提供的api例子來除錯裡面各個方法的作用這樣更好的梳理整個功能的執行邏輯,在這裡就體現了張鎮圳大神的所說的乙個模組的功能中**的邏輯梳理、可讀性、語義化多麼重要,但flowjs這個框架可以理解為專案的在js原生上封裝了一層脫了業務層的框架,這種框架一般是組長或是高階前端工程來維護,而且一般隨著時間的積累慢慢成熟成型後期的改動會很小,所以這裡只要相對用物件導向梳理下邏輯就可以,而業務層隨客戶的不斷增多,需求的改動頻繁出現,而且專案的大部分改動工作量都在業務層上,所以業務層**邏輯梳理、可讀性、語義化尤為重要,關係到後期維護的成本。}, getprev:noop, fail:noop, success:noop}, new step(init)));
我們先從文章中第乙個例子來除錯;
第一例子中就兩個函式乙個setnext,next;我們先來看setnext方法:
this.setnext = function(stepname, s, f);比較簡單,就是例項化step物件。之後我們在看next方法**:
this.next = function(stepname, s, f);下回分解。nextstep.getprev = function();
nextstep.fail = function();
nextstep.success = function();
if(alldone())).tostring.call(nextstepname) === '[object array]');
nextstep.getprev = function();
nextstep.fail = function();
nextstep.success = function();
/*物件上新增一系列方法 暫時忽略*/
**加了注釋基本很好理解就不多說了。下乙個重點是這句
if(alldone()){
spring原始碼分析 spring原始碼分析
1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...
思科VPP原始碼分析(dpo機制原始碼分析)
vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...
redux原始碼分析(三) 原始碼部分
下面是每個部分的一些解讀 createstore apicreatestore reducer,initialstate enhancer 曾經非常好奇這個函式的第二個引數到底是initialstate還是enhancer,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...