读zepto核心源码学习JS笔记(1)--整体框架

一 整体结构

  • 为了防止全局变量污染,zepto使用的是立即执行函数,写法结构为:
(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函数是整个框架源码的核心部分.这里只对这一部分进行分析.下面来看看这里究竟是怎么样的一个过程.

    我们在使用zepto的时候.经常会用到$();我们顺着这个过程去找代码

    • 首先$()中的$是什么呢,从下面代码可以明白$是Zepto函数的返回值,这里要注意Zepto是大写的;Zepto里定义了一个变量zepto,两者是不同的;
    var Zepto =(function(){
          ...
          zepto.Z.prototype = Z.prototype = $.fn
          $.zepto = zepto
          return $
    })()
    
    * 知道了$;我们再去找$();此函数的返回值为zepto.init
    ```java
        $ = function(selector, context){
            return zepto.init(selector, context)
       }
    ```
    * 同样,我们接着去找zepto.init()函数,返回值为zepto.Z()
    ```java
    zepto.init = function(selector, context) {
          ...
          return zepto.Z(dom, selector)
    }
    ```
    * 再接着找zepto.Z();返回值为Z函数的实例化
    ```java
    zepto.Z = function(dom, selector) {
        return new Z(dom, selector)
    }
    ```
    * 最后找Z函数;
    ```java
    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 || ''
    }
    ```


###二 分析
大致的流程如上,下面我根据以上的过程去分析代码.

以下为zepto源码节选:
```javascript
$ = 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()函数分为以下几种情况:

qqqq.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • zepto.init() 1. 首先是第一种情况,selector为空 既然是反向分析,那我们先看看这句话的代码...
    一二三kkxx阅读 2,844评论 0 1
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 6,495评论 1 10
  • <a name='html'>HTML</a> Doctype作用?标准模式与兼容模式各有什么区别? (1)、<...
    clark124阅读 8,996评论 1 19
  • 1.通过idea生成war包 双击package,生成的war包在target目录下。 2.服务器端下载vsftp...
    爱口红的夕夕阅读 3,892评论 0 6
  • 最早的一件事, 即将远离一次岗位 恰逢瓶颈 卡在一个数量与单价的不匹配 三五核查 终未有善果 迫在眉睫的要离开 直...
    亦柔阅读 1,720评论 0 0

友情链接更多精彩内容