(function(global,factory){ if(typeof define === 'function' && define.amd) define(function(){return factory(global)}) else factory(global) }(this,function(window){ return Zepto }))
Zepto
,也是个当即执行函数.var Zepto =(function(){})() //将Zepto赋值给window.Zepto;这样其余地方就能够调用zepto的方法了 window.Zepto = Zepto //当$变量未被占用时,将Zepto赋值给$ window.$ === undefined && (window.$ = Zepto)
Zepto函数是整个框架源码的核心部分.这里只对这一部分进行分析.下面来看看这里到底是怎么样的一个过程.javascript
咱们在使用zepto的时候.常常会用到$();咱们顺着这个过程去找代码var Zepto =(function(){ ... zepto.Z.prototype = Z.prototype = $.fn $.zepto = zepto return $ })()
$ = function(selector, context){ return zepto.init(selector, context) }
zepto.init = function(selector, context) { ... return zepto.Z(dom, selector) }
zepto.Z = function(dom, selector) { return new Z(dom, selector) }
function Z(dom, selector) { var i, len = dom ? dom.length : 0 for (i = 0; i < len; i++) this[i] = dom[i] this.length = len this.selector = selector || '' }
大体的流程如上,下面我根据以上的过程去分析代码.java
如下为zepto源码节选:框架
$ = function(selector, context){ return zepto.init(selector, context) }
zepto.init = function(selector, context) { var dom if (!selector) return zepto.Z() else if (typeof selector == 'string') { selector = selector.trim() if (selector[0] == '<' && fragmentRE.test(selector)) dom = zepto.fragment(selector, RegExp.$1, context), selector = null else if (context !== undefined) return $(context).find(selector) else dom = zepto.qsa(document, selector) } else if (isFunction(selector)) return $(document).ready(selector) else if (zepto.isZ(selector)) return selector else { if (isArray(selector)) dom = compact(selector) else if (isObject(selector)) dom = [selector], selector = null else if (fragmentRE.test(selector)) dom = zepto.fragment(selector.trim(), RegExp.$1, context), selector = null else if (context !== undefined) return $(context).find(selector) else dom = zepto.qsa(document, selector) } return zepto.Z(dom, selector) }
根据以上代码,能够将zepto.init()函数分为如下几种状况:
dom
下面我来一个状况一个状况的分析,遇到一个知识点我就会岔开话题去整理下涉及到的知识点看到哪写到哪,因此会有些乱.函数