// 初始化jQuery对象,即jQuery.fn.init对象
// @param selector 选择器,可能是DOM对象、html字符串、jQuery对象、函数或其他任意值。
// @param context 选择器选择的范围
// @param rootjQuery == $(document);
init: function( selector, context, rootjQuery ) {
  var match, elem;

  //如果selector是""、null、undefined、false,则返回this,这里的this指针指向init对象
  //如果在一个函数前面带上new来调用该函数,那么将创建一个隐藏连接到该函数的prototype成员的新对象,同时this将被绑定到那个新对象上。
  if ( !selector ) {
    return this;
  }

  // 如果selector 是String类型,走该分支进行处理
  if ( typeof selector === "string" ) {

    // 如果selector的第一个字符是“<”并且最后一个字符是">",并且长度大于3
    if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {

      // 将html储存入match数组中,并与另一个分支中的正则捕获相对应
      // 如果走这个分支则说明选择器为<a>这种形式,则跳过使用正则匹配,不全都使用正则匹配的原因是,可能返回空。
      match = [ null, selector, null ];

    } else {

    // rquickExpr 是在闭包中定义的局部变量,匹配得到的数组类似于:[全匹配, <tag>, #id]

    match = rquickExpr.exec( selector );
  }

  // 如果match不为空,并且match[1]也就是<tag>存在或者context不存在??
  if ( match && (match[1] || !context) ) {

    // 如果是<tag>的形式
    if ( match[1] ) {
      // 如果context是jQuery对象,则取其中的第一个DOM元素作为context
      context = context instanceof jQuery ? context[0] : context;

      // 将通过parseHTML处理生成的DOM对象merge进jQuery对象
      jQuery.merge( this, jQuery.parseHTML(
        match[1],
        //如果context存在并且是note节点,则context就是的顶级节点或自身,否则content=document
        context && context.nodeType ? context.ownerDocument || context : document,
        true
      ) );

      // isPlainObject DOM节点和window不是纯对象
      // rsingleTag 匹配一个独立的标签,例如<div></div> 或者 <div>

      // 这个分支没读懂
      if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
        for ( match in context ) {
          if ( jQuery.isFunction( this[ match ] ) ) {
            this[ match ]( context[ match ] );
          } else {
            this.attr( match, context[ match ] );
          }
        }
      }

      return this;

    //如果是#id的形式,走这个分支进行处理
    } else {
      //通过getEle方法获得DOM对象 将match[2]传入,是因为#id的形式是在第二个捕获组里面储存的。
      elem = document.getElementById( match[2] );

      // 如果该id元素存在并且该元素有父节点(判断父节点的原因是??)
      if ( elem && elem.parentNode ) {

        // 将该元素保存进jQuery对象数组当中,并设置其length值为1
        this.length = 1;
        this[0] = elem;
      }

      // 将jQuery的context属性设置为document,selector属性设置为selector
      this.context = document;
      this.selector = selector;

      // 返回生成的jQuery对象
      return this;
    }

  //如果context不存在或者context是jQuery对象 //通过检测是不是有jquery属性
  } else if ( !context || context.jquery ) {

    // 进入Sizzle进行处理(复杂的选择器)
    return ( context || rootjQuery ).find( selector );

  //context存在并且context不是jQuery对象的情况 先调用$(context),在进入Sizzle进行处理
  } else {
    return this.constructor( context ).find( selector );
  }

  //如果selector不是String,是DOM元素
  } else if ( selector.nodeType ) {
    //直接将DOM元素存入jQuery对象并设置context和length
    this.context = this[0] = selector;
    this.length = 1;
    return this;

  //此分支是为了简化$(document).ready(function(){});
  } else if ( jQuery.isFunction( selector ) ) {
    return rootjQuery.ready( selector );
  }

  //此处为什么不走else if?而是单独判断?
  //如果selector是jQuery对象,则设置新jQuery对象的selector和context和原对象的一致。
  if ( selector.selector !== undefined ) {
    this.selector = selector.selector;
    this.context = selector.context;
  }

  //为最后一个if返回值。
  return jQuery.makeArray( selector, this );
},

jQuery的init都做了些什么的更多相关文章

  1. 从架构演进的角度聊聊Spring Cloud都做了些什么?

    Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cl ...

  2. 从架构演进的角度聊聊Spring Cloud都做了些什么

    1.从架构演进的角度聊聊Spring Cloud都做了些什么?2.中小型互联网公司微服务实践-经验和教训3.Spring Cloud在国内中小型公司能用起来吗?

  3. 【dotnet跨平台】&quot;dotnet restore&quot;和&quot;dotnet run&quot;都做了些什么?

    [dotnet跨平台]"dotnet restore"和"dotnet run"都做了些什么? 前言: 关于dotnet跨平台的相关内容.能够參考:跨平台.NE ...

  4. [转帖]支撑双11每秒17.5万单事务 阿里巴巴对JVM都做了些什么?

    支撑双11每秒17.5万单事务 阿里巴巴对JVM都做了些什么? https://mp.weixin.qq.com/s?__biz=MzA3OTg5NjcyMg==&mid=2661671930 ...

  5. linux中,当执行rpm -e删除一个软件包时,都做了些什么事

    问题描述: 今天在通过rpm进行删除软件包时,出现了问题,就引发了我对于rpm包执行删除动作时的一些行为做了思考,之前找了很多的文章,后来想如果有debug日志信息,那么不就都清楚了吗 通过打印rpm ...

  6. 阿里巴巴AI Lab成立两年,都做了些什么?

    https://mp.weixin.qq.com/s/trkCGvpW6aCgnFwLxrGmvQ 撰稿 & 整理|Debra 编辑|Debra 导读:在 2018 云栖人工智能峰会上,阿里巴 ...

  7. alloc 和 init都做了什么验证。

    结论: alloc负责分配内存和创建对象对应的isa指针: init只是返回alloc生成的对象.  所以alloc后,多次调用init,返回的对象是同一个! 代码如下: // // main.m / ...

  8. dreamvc框架(三),dispartcher做了些什么

    这一篇我会介绍一些dreamvc的核心类Dispatcher都做了些什么,首先我们先来看一看init方法,这是在DispatcherServlet和DispatcherFilter里面都会调用到的一个 ...

  9. 看看C# 6.0中那些语法糖都干了些什么(中篇)

    接着上篇继续扯,其实语法糖也不是什么坏事,第一个就是吃不吃随你,第二个就是最好要知道这些糖在底层都做了些什么,不过有一点 叫眼见为实,这样才能安心的使用,一口气上五楼,不费劲. 一:字符串嵌入值 我想 ...

随机推荐

  1. Winform控件学习笔记【第六天】——TreeView

    TreeView控件用来显示信息的分级视图,如同Windows里的资源管理器的目录.TreeView控件中的各项信息都有一个与之相关的Node对象.TreeView显示Node对象的分层目录结构,每个 ...

  2. ISAPI和CGI限制中没有ASP.NET v4.0 ; vS2013检测到在集成的托管管道模式下不适用的 ASP.NET 设置。

    统确实自带了ASP.NET v4.0,但是ISAPI中没有这个选项,导致服务器开不起来 解决方法如下: 1.确保安装IIS时确实安装了ASP.NET,如果没有的话,勾上重新装一下,一般出现404.2时 ...

  3. interpro 数据库

    interpro 通过整合多个蛋白相关的数据库,提供了一个方便的对蛋白序列进行功能注释的平台,功能注释的内容包括蛋白质家族预测,domain 和 结合位点预测 interoro 在整合多个数据库的同时 ...

  4. Castle.Windsor依赖注入的高级应用_Castle.Windsor.3.1.0

    [转]Castle.Windsor依赖注入的高级应用_Castle.Windsor.3.1.0 1. 使用代码方式进行组件注册[依赖服务类] using System; using System.Co ...

  5. 仿网易nec首页动画效果

    仿网页nec首页动画效果nec链接:http://nec.netease.com/ 首先,介绍animationanimation检索或设置对象所应用的动画特效.animation由“keyframe ...

  6. Thinkphp5 多图上传

    html代码 <div class="content" id="content_list"> <!-- 上传部分 --> <for ...

  7. 用pip批量更新所有包

    p.s在先,事实证明,把电脑里所有的python包一次性更新是吃力不讨好的工作,不过,这是另一回事,如果你一定要这么做,根据http://stackoverflow.com/questions/272 ...

  8. Oralce SQLPlus 以及shell脚本中spool输出到文件时的格式化输出

    http://blog.csdn.net/gyanp/article/details/7903056 1) 格式调整有以下参数 set echo on/off                     ...

  9. git statsh命令报错解决

    git stash命令主要用于当在一个分支的开发工作未完成,却又要切换到另外一个分支进行开发的时候,除了commit原分支的代码改动的方法外,提供暂存代码的方式. git stash命令参考这篇:ht ...

  10. docker 相关文章

    https://baijiahao.baidu.com/s?id=1581420975184566963&wfr=spider&for=pc    创建centos基础镜像 https ...