返回不存在重複值的數組css
判斷classCache中是否已存在name,若存在則取出classCache[name];不然存入該類名的正則表達式至classCache[name]中html
若name在cssNumber中則返回value;不然返回value+"px"node
從elementDisplay中獲取該nodeName(即標籤類名:a,div,p……)的默認display值;若elementDisplay中不存在nodeName該項,則新建該節點並添加到文檔中經過getComputedStyle(element, '').getPropertyValue("display")獲取其默認值,若默認爲none則設爲「block」並存入elementDisplay[nodeName]中正則表達式
ps:zepto中定義了getComputedStyle=document.defaultView.getComputedStyle數組
若elements是類數組(elements.length 是 number類型),則用for(var i = 0,l=elements.length ; i < l ; i++)來加速循環調用callbackdom
若不是類數組,則使用for in來循環對每一個屬性調用callback函數
上述兩個循環中一旦callback返回值爲false即中斷循環優化
最後返回值均爲elementsthis
map函數和each函數的優化策略是同樣的,只是map返回的是單一對象(elements.length <= 0)或一組數組(elements.length > 0),結果中存放遍歷函數的運行結果spa
將dom的原型設爲$.fn,以便返回值能調用$.fn的方法
判斷object的原型是否zepto.Z(zepto.Z.prototype = $.fn)
進入下述其中一條分支,按順序依次判斷
a.若!selector則返回空的zepto collection,也就是zepto.Z()
b.若selector是函數則在DOMContentLoaded後執行
c.若selector已是Z對象,則返回selector自己
d.若非上述三種狀況,則進入下述其中一條分支,按順序依次判斷
d1.若selector是Array,則dom=compact(selector)
d2.若selector是對象:
d21.若isPlainObject(selector)爲true,則dom爲selector的副本(淺複製)
d22.若isPlainObject(selector)爲flase,則dom=selector
令selector = null;
d3.若selector符合fragmentRE(html片斷),則dom爲根據該片斷生成的節點,令selector = null
d4.若存在context,則返回$(context).find(selector),也就是context中的selector節點,此時init函數已經結束
d5.若非上述狀況,則dom=zepto.qsa(document, selector),也就是從document中查找符合selector的節點
若符合d1,d2,d3,d5則返回zepto.Z(dom,selector)
對html進行拓展(若html爲"<div/>",則拆分閉合後爲"<div></div>")
若name沒定義,則經過正則表達式從html中獲取name
若name不在containers中,則name = 「*」
建立一個container,令其等於containers[name],並使其innerHTML=html;
dom = $.each(slice.call(container.childNodes), function(){ container.removeChild(this) })
若是isPlainObject(properties)返回true,則另nodes=$(dom),並對nodes設置properties 這3行代碼不只使dom=slice.call(container.childNodes),還清空了container的內容,使container不受污染
最後,返回dom(此時dom是slice.call(container.childNodes), 並非z集合)
此處不直接使用$=zepto.init是由於要對$進行擴展而不會影響zepto.init