一、jquery源码1-60行

该部分代码主要完成jquery对象的创建,以及全局变量$与jQurey类的映射;

/*
* jQuery - New Wave Javascript
*
* Copyright (c) 2006 John Resig (jquery.com)
* Dual licensed under the MIT (MIT-LICENSE.txt)
* and GPL (GPL-LICENSE.txt) licenses.
*
* $Date: 2006-10-27 23:14:48 -0400 (Fri, 27 Oct 2006) $
* $Rev: 509 $
*/ // Global undefined variable
window.undefined = window.undefined;
function jQuery(a,c) { // Shortcut for document ready (because $(document).each() is silly)
if ( a && a.constructor == Function && jQuery.fn.ready )
return jQuery(document).ready(a); // Make sure that a selection was provided
a = a || jQuery.context || document; // Watch for when a jQuery object is passed as the selector
if ( a.jquery )
return $( jQuery.merge( a, [] ) ); // Watch for when a jQuery object is passed at the context
if ( c && c.jquery )
return $( c ).find(a); // If the context is global, return a new object
if ( window == this )
return new jQuery(a,c); // Handle HTML strings
var m = /^[^<]*(<.+>)[^>]*$/.exec(a);
if ( m ) a = jQuery.clean( [ m[1] ] ); // Watch for when an array is passed in
this.get( a.constructor == Array || a.length && !a.nodeType && a[0] != undefined && a[0].nodeType ?
// Assume that it is an array of DOM Elements
jQuery.merge( a, [] ) : // Find the matching elements and save them for later
jQuery.find( a, c ) ); // See if an extra function was provided
var fn = arguments[ arguments.length - 1 ]; // If so, execute it in context
if ( fn && fn.constructor == Function )
this.each(fn);
} // Map over the $ in case of overwrite
if ( $ )
jQuery._$ = $; // Map the jQuery namespace to the '$' one
var $ = jQuery;

二、关于window.undefined

window.undefined = window.undefined;

这样写无论window有没定义undefined,window.undefined都能正确表示它的意思,在有些早期浏览器中window并没有定义undefined变量,所以jquery1.0中这样写;

三、关于ready函数

if ( a && a.constructor == Function && jQuery.fn.ready )
return jQuery(document).ready(a);

ready方法为jquery对象的原型方法,在源文件1093行中利用jquery的extend方法扩展的;

jquery中ready函数有两种写法:

1、直接调用原型方法ready

$(document).ready(function(){ /* do something */ }) 

2、直接往jQuery方法传入function对象

$(function(){ /* do something */ })  

三、a = a || jQuery.context || document;

确保选中一个对象,如果a和jQuery.context都没定义,则会返回一个封装了document的jquery对象,如下:

var $obj = $();         //$obj等同于$(document)

四、jquery对象作为参数传入

    if ( a.jquery )
return $( jQuery.merge( a, [] ) );

注意每个jquery对象都有jquery属性,值为它的版本号,因此可用此属性判断对象是否是jquery对象;

如果是jquery对象,则返回一份它的拷贝,注意jquery对象里面的DOM对象指的还是同一个引用,其它属性有各自的空间,具体可看merge和get方法内部实现,后续会讨论到;

例:

    var objTmp = $("<p>23</p>");
var objTmp2 = $(objTmp);
objTmp2.jquery = 'ss';
var test1 = objTmp.jquery; //test1="$Rev: 509 $"
var test2 = objTmp2.jquery; //test2="ss" var objTmp = $("123<p>23</p>sds");
var objTmp2 = $(objTmp);
objTmp2.html("hello");
var test1 = objTmp.html(); //test1 = "hello"
var test2 = objTmp2.html(); //test2 = "hello"

五、返回某jquery对象context下的jquery对象

    if ( c && c.jquery )
return $( c ).find(a);

例:

var objTmp4 = $(".testDIv", $obj); //返回$obj节点下所有clss为testDIv的jquery对象

六、new jQuery

 if ( window == this )
return new jQuery(a,c);

如果context是全局的,则new一个jquery对象并返回;

例如:$("#id");

该情况context是全局的,第一次运行到该语句,条件成立(window==this),因为js代码都是在window作用于下运行的,第二次运行到该语句的时候,jquery对象已经new出来了,此时this为new出来的对象,条件不成立(window!=this),跳过;

七、匹配处理html字符串

    var m = /^[^<]*(<.+>)[^>]*$/.exec(a);
if ( m ) a = jQuery.clean( [ m[1] ] );

注意第一句, 该正则表达式^[^<]*(<.+>)[^>]*$,

[^<]  *       //匹配n个非<字符,

(<.+>)       // 匹配<除“\r\n”之外的任何单个字符>

[^>]*        //匹配n个非>字符,

第二句,当匹配成功时,调用clean函数处理,参数为尖括号里面的字符串,clean函数通过document.createElement("div")创建一个临时div对象,然后将参数赋给innerHTML,最后将临时div的childNodes压入数组返回给a;

八、为jquery对象里的Dom对象、length赋值

 this.get( a.constructor == Array || a.length && !a.nodeType && a[0] != undefined && a[0].nodeType ?
jQuery.merge( a, [] ) : jQuery.find( a, c ) );

往get函数传入数组或者类数组对象,get方法通过该数组参数生成Dom对象和length值,关于这部分的get源码如下

   this.length = 0;
[].push.apply( this, num );
return this;

简单的说,就是在jquery对象中push进数组中的dom对象,由于jquery对象通过apply调用数组中的push方法,length也自动++;

push完成后,该jquery对象就拥有了length和一系列dom元素(如果有的话);

通过调用merge和find函数,会返回数组;

九、最后一个参数是函数的情况

    var fn = arguments[ arguments.length - 1 ];

    if ( fn && fn.constructor == Function )
this.each(fn);

如果最后一个参数是函数,则遍历执行;

十、全局变量$

if ( $ )
jQuery._$ = $;
var $ = jQuery;

如果已经定义$,则将$保存到 jQuery下,防止overwrite;

将jQuery namespace映射到$下,可少写5个字符;

jquery1.0源码【1-60行】构造函数及全局$变量的更多相关文章

  1. AFNetworking 3.0 源码解读(八)之 AFImageDownloader

    AFImageDownloader 这个类对写DownloadManager有很大的借鉴意义.在平时的开发中,当我们使用UIImageView加载一个网络上的图片时,其原理就是把图片下载下来,然后再赋 ...

  2. AFNetworking 3.0 源码解读(三)之 AFURLRequestSerialization

    这篇就讲到了跟请求相关的类了 关于AFNetworking 3.0 源码解读 的文章篇幅都会很长,因为不仅仅要把代码进行详细的的解释,还会大概讲解和代码相关的知识点. 上半篇: URI编码的知识 关于 ...

  3. 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

                 分类: Android 系统开发(5)                                              作者同类文章X 版权声明:本文为博主原创文章 ...

  4. spring boot 2.0 源码分析(一)

    在学习spring boot 2.0源码之前,我们先利用spring initializr快速地创建一个基本的简单的示例: 1.先从创建示例中的main函数开始读起: package com.exam ...

  5. spring boot 2.0 源码分析(二)

    在上一章学习了spring boot 2.0启动的大概流程以后,今天我们来深挖一下SpringApplication实例变量的run函数. 先把这段run函数的代码贴出来: /** * Run the ...

  6. spring boot 2.0 源码分析(三)

    通过上一章的源码分析,我们知道了spring boot里面的listeners到底是什么(META-INF/spring.factories定义的资源的实例),以及它是创建和启动的,今天我们继续深入分 ...

  7. AFNetworking 3.0 源码解读 总结(干货)(下)

    承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...

  8. AFNetworking 3.0 源码解读(十一)之 UIButton/UIProgressView/UIWebView + AFNetworking

    AFNetworking的源码解读马上就结束了,这一篇应该算是倒数第二篇,下一篇会是对AFNetworking中的技术点进行总结. 前言 上一篇我们总结了 UIActivityIndicatorVie ...

  9. AFNetworking 3.0 源码解读(十)之 UIActivityIndicatorView/UIRefreshControl/UIImageView + AFNetworking

    我们应该看到过很多类似这样的例子:某个控件拥有加载网络图片的能力.但这究竟是怎么做到的呢?看完这篇文章就明白了. 前言 这篇我们会介绍 AFNetworking 中的3个UIKit中的分类.UIAct ...

随机推荐

  1. 使用 PSD Validator 在线校验 PSD 文件的质量

     PSD Validator 可以帮助你在线校验 PSD 文件的质量,使用的规则来自 Photoshop Etiquette.Photoshop Etiquette 整理了 PSD 文件的规范,例如删 ...

  2. iOS-UISegmentedControl-隐藏边框

    原理: 1. 用tintColor属性,把整个UISEgmentControl 设置成为透明色. 2. 设置正常状态下的titleTextAttributes.和选中状态下的titleTextAttr ...

  3. .NET ORM 哪家强

    ORM到底哪家强? 很多人都想知道这个问题,自已也没测试过,只能道听途说. 闲的无聊就将几个ORM拿出来比一比,假如怀疑测试代码有问题可以将它下载下来慢慢研究. 参赛ORM 1.SqlSugar:是一 ...

  4. 领域驱动设计(DDD)实现之路

    2004年,当Eric Evans的那本<领域驱动设计——软件核心复杂性应对之道>(后文简称<领域驱动设计>)出版时,我还在念高中,接触到领域驱动设计(DDD)已经是8年后的事 ...

  5. SQL年月日方面的查询信息

    这是计算一个月第一天的SQL 脚本:   SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) --当月的第一天 SELECT DATEADD(mm, DAT ...

  6. 给文本框添加模糊搜索功能(“我记录”MVC框架下实现)

    步骤: 1.在文本框中输入内容时,触发keyup事件: 2.在keyup事件的处理方法中,通过Ajax调用控制器的方法: 3.在控制器方法中,搜索满足条件的数据,这里分页获取数据,且只取第一页的数据, ...

  7. HTML5实现音频播放

    Web 上的音频 直到现在,仍然不存在一项旨在网页上播放音频的标准. 今天,大多数音频是通过插件(比如 Flash)来播放的.然而,并非所有浏览器都拥有同样的插件. HTML5 规定了一种通过 aud ...

  8. 有关C#标签Attribute的熟悉

    Attribute 简单用法: 最近用到了,所以静下心来找些资料看了一下,终于把这东西搞清楚了. 一.什么是Attribute 先看下面的三段代码: 1.自定义Attribute类:VersionAt ...

  9. ANT自动打包U3D安卓项目研究笔记

    概述 因项目使用Atlassian Stash作为项目源码管理端,且其支持Ant命令自动编译,可使其根据最新的代码自动打包,故产生该研究Ant打包的任务.在此将研究过程及一些相关知识整理记录在此. 本 ...

  10. csharp: Export DataSet into Excel and import all the Excel sheets to DataSet

    /// <summary> /// Export DataSet into Excel /// </summary> /// <param name="send ...