(function (global, factory) {
     factory(global);
 })(this, function (window, noGlobal) {
     var rootjQuery;
     var class2type = {};
     var toString = class2type.toString;
     var arr = [];
     var indexOf = arr.indexOf;
     var myJQuery = function (selector, context) {
         return new myJQuery.fn.init(selector, context);
     };

     myJQuery.fn = myJQuery.prototype = {
         constructor: myJQuery,//为撒指定
         length: 0,
         each: function (callback) {
             return myJQuery.each(this, callback);
         },
         pushStack: function (elems) {
             var ret = myJQuery.merge(this.constructor(), elems);
             ret.prevObject = this;
             ret.context = this.context;
             return ret;
         }
     };

     myJQuery.extend = myJQuery.fn.extend = function () {
         var options, name, src, copy, target = arguments[0] || {}, length = arguments.length, i = 1;
         if (i === length) {
             target = this;
             i--;
         }
         for (; i < length; i++) {
             if ((options = arguments[i]) != null) {
                 for (name in options) {
                     src = target[name];
                     copy = options[name];
                     if (target === copy) {
                         continue;
                     }

                     if (copy !== undefined) {
                         target[name] = copy;
                     }
                 }
             }
         }
         return target;
     };

     function isArrayLike(obj) {
         var length = !!obj && "length" in obj && obj.length,
             type = myJQuery.type(obj);
         if (type === "function" || myJQuery.isWindow(obj)) {
             return false;
         }

         return type === "array" || length === 0 ||
             typeof length === "number" && length > 0 && ( length - 1 ) in obj;
     }

     myJQuery.extend({
         isWindow: function( obj ) {
             return obj != null && obj === obj.window;
         },
         //extend each,是一种静态方法 调用方式 myJQuery.each(.....)
         each: function (obj, callback) {
             var length, i = 0;
             if (isArrayLike(obj)) {
                 //如果是数组
                 length = obj.length;//设置的属性
                 for (; i < length; i++) {
                     if (callback.call(obj[i], i, obj[i]) === false) {
                         break;
                     }
                 }
             }
             else{
                 //如果是对象
                 for(i in obj){
                     if(callback.call(obj[i],i,obj[i])===false){
                         break;
                     }
                 }
             }
             return obj;
         },
         isFunction: function (obj) {
             return myJQuery.type(obj) === "function";
         },
         type: function (obj) {
             if (obj == null) {
                 return obj + "";
             }

             // Support: Android<4.0, iOS<6 (functionish RegExp)
             /*return typeof obj === "object" || typeof obj === "function" ?
              class2type[toString.call(obj)] || "object" :
              typeof obj;*/
             return typeof obj;
         },
         merge: function (first, second) {
             var len = +second.length,
                 j = 0,
                 i = first.length;
             for (; j < len; j++) {
                 first[i++] = second[j];
             }
             first.length = i;
             return first;
         },
         inArray: function (elem, arr, i) {
             return arr == null ? -1 : indexOf.call(arr, elem, i);
         }
     });

     myJQuery.fn.extend({
         find: function (selector) {
             var ret = [];
             var arr = [12, 35, 68];
             ret = this.pushStack(arr);
             ret.selector = selector;
             return ret;
         }
     });

     var rnotwhite = (/\S+/g); //大s 非空白字符 小s 空白字符
     ///g 表示该表达式将用来在输入字符串中查找所有可能的匹配,返回的结果可以是多个。如果不加/g最多只会匹配一个

     function createOptions(options) {
         var object = {};
         //match 匹配成功,返回数组,否则 返回null
         myJQuery.each(options.match(rnotwhite) || [], function (_, flag) {
             object[flag] = true;
         });
         return object;
     }

     myJQuery.Callbacks = function (options) {
         options = typeof  options === "string" ? createOptions(options) : myJQuery.extend({}, options);
         var firing, memory, fired, locked, list = [], queue = [], firingIndex = -1;
         var fire = function () {
             locked = options.once;
             for (; queue.length; firingIndex = -1) {
                 memory = queue.shift();
                 while (++firingIndex < list.length) {
                     if(list[firingIndex].apply(memory[0], memory[1])===false && options.stopOnFalse===true){
                         firingIndex=list.length;
                         memory = false; //预防 参数里有 memory
                     }
                 }
             }

             //memory是一个全局变量,一直存在,而在add的时候,又有
             // if(memory && !firing){ fire(); }
             if(!options.memory){
                 memory=false;
             }

             if (locked) {
                 if (memory) {
                     list=[];
                 } else {
                     list = "";
                 }
             }
         };
         var self = {
             add: function () {
                 if (list) {
                     if (memory && !firing) {
                         firingIndex = list.length - 1;
                         queue.push(memory);
                     }

                     (function addSelf(args) {
                         myJQuery.each(args, function (_, arg) {
                             if (myJQuery.isFunction(arg)) {
                                 if (!options.unique || !self.has(arg)) {
                                     list.push(arg);
                                 }
                             } else if (arg && arg.length && myJQuery.type(arg) !== "string") {
                                 //适用于 add([fn1,fn2]);
                                 addSelf(arg);
                             }
                         });
                     })(arguments);

                     if(memory && !firing){
                         //传入 memory关键字,在add的时候,将之前所有的fn fire 一次
                         fire();
                     }
                     return this;
                 }
             },
             remove: function () {
                 myJQuery.each(arguments, function (_, arg) {
                     var index = 0;
                     while ((index = myJQuery.inArray(arg, list, index)) > -1) {
                         list.splice(index, 1);
                     }
                 });
                 return this;
             },
             has: function (fn) {
                 return fn ? myJQuery.inArray(fn, list) > -1 : list.length > 0;
             },
             empty: function () {
                 if (list) {
                     list = [];
                 }
                 return this;
             },
             disable: function () {

             },
             disabled: function () {

             },
             lock: function () {

             },
             locked: function () {

             },
             fireWith: function (context, args) {
                 //when options.once=true,the locked=true,and not fired
                 if (!locked) {
                     args = args || [];
                     queue.push([context, args]);
                     fire();
                 }
                 return this;
             },
             fire: function () {
                 self.fireWith(this, arguments);
                 return this;
             },
             fired: function () {

             }
         };
         return self;
     }
     var init = myJQuery.fn.init = function (selector, context, root) {
         if (!selector) {
             return this;
         }
         root = root || rootjQuery;
         //处理标签 div p li
         if (typeof selector === "string") {
             return ( context || root ).find(selector);
         } else if (selector.nodeType) {
             this.context = this[0] = selector;
             this.length = 1;
             return this;
         }
     };

     init.prototype = myJQuery.fn;

     rootjQuery = myJQuery(document);

     if (!noGlobal) {
         window.myJQuery = window.F$ = myJQuery;
     }

     return myJQuery;
 });

JQuery源码解析--callbacks的更多相关文章

  1. jquery源码解析:代码结构分析

    本系列是针对jquery2.0.3版本进行的讲解.此版本不支持IE8及以下版本. (function(){ (21, 94)     定义了一些变量和函数,   jQuery = function() ...

  2. JQuery源码解析(一)

    写在前面:本<JQuery源码解析>系列是基于一些前辈们的文章进行进一步的分析.细化.修改而写出来的,在这边感谢那些慷慨提供科普文档的技术大拿们. 要查阅JQ的源文件请下载开发版的JQ.j ...

  3. jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究

    终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...

  4. jquery源码解析:jQuery工具方法Callbacks详解

    我们首先来讲下Callbacks是如何使用的:第一个例子 function a(){} function b(){} var cb = $.Callbacks(); cb.add(a); cb.add ...

  5. jQuery源码解析资源便签

    最近开始解读jQuery源码,下面的链接都是搜过来的,当然妙味课堂 有相关的一系列视频,长达100多期,就像一只蜗牛慢慢爬, 至少品读三个框架,以后可以打打怪,自己造造轮子. 完全理解jQuery源代 ...

  6. jquery 源码解析

    静态与实力方法共享设计 遍历方法 $(".a").each() //作为实例方法存在 $.each() //作为静态方法存在 Jquery源码 jQuery.prototype = ...

  7. 三.jQuery源码解析之jQuery的框架图

    这张图片是对jQuery源码截图,一点一点拼出来的. 现在根据这张图片来对jQuery框架做一些说明. 一.16~9404行可以发现,最外层是一个自调用函数.当jQuery初始化时,这个自调用函数包含 ...

  8. 一.jQuery源码解析之总体架构

    (function (window, undefined) { //构建jQuery对象 var document = window.document, navigator = window.navi ...

  9. jquery源码解析:addClass,toggleClass,hasClass详解

    这一课,我们将继续讲解jQuery对元素属性操作的方法. 首先,我们先看一下这几个方法是如何使用的: $("#div1").addClass("box1 box2&quo ...

随机推荐

  1. python download

    今天下载 python3 , 从官网下 速度 平均 十几K,网上 搜了下.提供的下载地址 几乎都是 官网的. 于是 下了个 百度同步盘,做 公开分享. 提供给 大家下载,速度 有 300 多K,提高了 ...

  2. 哈夫曼树---POJ3253

    http://poj.org/problem?id=3253 这就是 最典型的哈夫曼树的题型,我们就根据这道题学习一下哈夫曼树 这是最开始我们把21据下来之后我们据下8,然后再据下5得到34,可以看出 ...

  3. 64位系统装oracle(ora-12154 )

    装了n次的oracle,昨下午装服务器的oracle,结果遇到了一个问题,让我百思不得其解,但最终在大家的帮助下终于解决了. 我装的服务器是windows server 2007 64位的,装完ora ...

  4. ORM艰辛路之EF

    经过一段时间对EF的研究,发现EF还是有很大的作用的,起码比自己写代码快捷许多.不过往往一个学习一个新东西开始都是简单的,后面才慢慢了解到它的许多不方便 优点: EF在对一个实体的增删改以及继承方面做 ...

  5. 利用JAVA生成二维码

    本文章整理于慕课网的学习视频<JAVA生成二维码>,如果想看视频内容请移步慕课网. 维基百科上对于二维码的解释. 二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图 ...

  6. Unity IOC简单认知

    看了不少IOC的文章.简单概念梳理下. 1.依赖,依赖倒置,控制反转(IOC),依赖注入 解释是仿照http://www.cnblogs.com/qqlin/archive/2012/10/09/27 ...

  7. 关于C中struct和union长度的详解

    这几天看<代码大全>中的第十三章---不常见的数据类型,里面讲解到了C语言中的struct以及对指针的解释,联想到以前看过相关的关于C语言中stuct长度的文章,只是现在有些淡忘了,因此今 ...

  8. java自编时间工具类

    package timeTools; import java.text.ParseException; import java.text.SimpleDateFormat; import java.u ...

  9. WPF绘制矢量图形模糊的问题

    WPF默认提供了抗锯齿功能,通过向外扩展的半透明边缘来实现模糊化.由于WPF采用了设备无关单位,当设备DPI大于系统DPI时,可能会产生像素自动扩展问题,这就导致线条自动向外扩展一个像素,并且与边缘相 ...

  10. jq之ajax以及json数据传递

    <html> <head><meta http-equiv="Content-Type" content="text/html; chars ...