本文部分截取自且行且思

jQuery.each方法用于遍历一个数组或对象,并对当前遍历的元素进行处理,在jQuery使用的频率非常大,下面就这个函数做了详细讲解:

  1. 复制代码代码
  2. /*!
  3. * jQuery源码分析-each函数
  4. * jQuery版本:1.4.2
  5. *
  6. * ----------------------------------------------------------
  7. * 函数介绍
  8. *
  9. * each函数通过jQuery.extend函数附加到jQuery对象中:
  10. * jQuery.extend({
  11. * each: function() {}
  12. * });
  13. * 如果对jQuery.extend函数源码还不了解,可以参考《jQuery源码分析-extend函数》一文
  14. *
  15. * jQuery.each方法用于遍历一个数组或对象,并对当前遍历的元素进行处理
  16. * jQuery.each方法可以为处理函数增加附带的参数(带参数与不带参数的回调使用方法不完全一致)
  17. *
  18. * ----------------------------------------------------------
  19. * 使用说明
  20. * each函数根据参数的类型实现的效果不完全一致:
  21. * 1、遍历对象(有附加参数)
  22. * $.each(Object, function(p1, p2) {
  23. * this; //这里的this指向每次遍历中Object的当前属性值
  24. * p1; p2; //访问附加参数
  25. * }, ['参数1', '参数2']);
  26. *
  27. * 2、遍历数组(有附件参数)
  28. * $.each(Array, function(p1, p2){
  29. * this; //这里的this指向每次遍历中Array的当前元素
  30. * p1; p2; //访问附加参数
  31. * }, ['参数1', '参数2']);
  32. *
  33. * 3、遍历对象(没有附加参数)
  34. * $.each(Object, function(name, value) {
  35. * this; //this指向当前属性的值
  36. * name; //name表示Object当前属性的名称
  37. * value; //value表示Object当前属性的值
  38. * });
  39. *
  40. * 4、遍历数组(没有附加参数)
  41. * $.each(Array, function(i, value) {
  42. * this; //this指向当前元素
  43. * i; //i表示Array当前下标
  44. * value; //value表示Array当前元素
  45. * });
  46. * ----------------------------------------------------------
  47. *
  48. */
  49. //jQuery.each(), $.each()
  50. //@param {Object}|{Array} object 需要遍历处理的对象或数组
  51. //@param {Function} callback 遍历处理回调函数
  52. //@param {Array} args callback回调函数的附加参数
  53. each: function(object, callback, args){
  54.  
  55. //当需要遍历的是一个对象时,name变量用于记录对象的属性名
  56. var name,
  57.  
  58. //当需要遍历的是一个数组时,i变量用于记录循环的数组下标
  59. i = ,
  60.  
  61. //遍历数组长度,当需要遍历的对象是一个数组时存储数组长度
  62. //如果需要遍历的是一个对象,则length === undefined
  63. length = object.length,
  64.  
  65. //检查第1个参数object是否是一个对象
  66. //根据object.length排除数组类型,根据isFunction排除函数类型(因为函数也是对象)
  67. isObj = length === undefined || jQuery.isFunction(object);
  68.  
  69. //回调函数具有附加参数时,执行第一个分支
  70. //if(!!args) {
  71. if (args) {
  72.  
  73. //需要遍历的是一个对象
  74. if (isObj) {
  75.  
  76. //遍历对象属性,name是对象的属性名,再函数顶部已声明
  77. //许多人不太习惯for(var name in object)方式,如果不进行声明,则name就会被定义为全局变量
  78. for (name in object) {
  79.  
  80. //调用callback回调函数,且回调函数的作用域表示为当前属性的值
  81. //如:callback() { this; //函数中的this指向当前属性值
  82. //将each的第3个参数args作为回调函数的附加参数
  83. if (callback.apply(object[name], args) === false) {
  84.  
  85. //如果在callback回调函数中使用return false;则不执行下一次循环
  86. break;
  87. }
  88. }
  89. }
  90. //需要遍历的是一个数组
  91. else {
  92.  
  93. //循环长度,循环变量i在函数顶部已定义
  94. //循环变量的自增在循环内部执行
  95. for (; i < length;) {
  96.  
  97. //调用callback函数,与上面注释的callback调用一致
  98. //此处callback函数中的this指向当前数组元素
  99. if (callback.apply(object[i++], args) === false) {
  100. break;
  101. }
  102. }
  103. }
  104.  
  105. }
  106. //回调函数没有附加参数时,执行第二个分支
  107. else {
  108.  
  109. //需要遍历的是一个对象
  110. if (isObj) {
  111.  
  112. //循环对象的属性名,name在函数顶部已定义
  113. for (name in object) {
  114.  
  115. //调用callback回调函数
  116. //在不带参数的对象遍历中,作用域表示为当前属性的值
  117. //且回调函数包含两个参数,第一个数当前属性名,第二个是当前属性值
  118. //我觉得这句代码修改一下会更好用:if(callback.call(object, name, object[name]) === false) {
  119. if (callback.call(object[name], name, object[name]) === false) {
  120.  
  121. //如果在callback回调函数中使用return false;则不执行下一次循环
  122. break;
  123. }
  124. }
  125. }
  126. //需要遍历的是一个数组
  127. else {
  128. //这里的for写法有点BT,解释为:
  129. //var value = object[0];
  130. //for(; i < length;) {
  131. // if(false === callback.call(value, i, value)) {
  132. // break;
  133. // }
  134. // value = object[++i];
  135. //}
  136. //同样,我觉得这里的代码稍加修改会更好用:
  137. //for (; i < length && false !== callback.call(object, i, object[i++]);) {
  138. //}
  139. for (var value = object[]; i < length && callback.call(value, i, value) !== false; value = object[++i]) {
  140. }
  141. }
  142. }
  143.  
  144. //这里返回遍历的对象或数组,但object没有被更改,因此一般不给$.each()赋值
  145. //但是如果按照我在注释中所修改的写法来使用,且在callback回调函数中对this(即对object的引用)进行了修改
  146. //则这里返回的object是被修改后的对象或数组
  147. return object;
  148. }

jQuery源码分析-each函数的更多相关文章

  1. jquery源码分析-工具函数

    jQuery的版本一路狂飙啊,现在都到了2.0.X版本了.有空的时候,看看jquery的源码,学习一下别人的编程思路还是不错的. 下面这里是一些jquery的工具函数代码,大家可以看看,实现思路还是很 ...

  2. jQuery源码分析系列

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...

  3. [转]jQuery源码分析系列

    文章转自:jQuery源码分析系列-Aaron 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAaro ...

  4. jQuery源码分析系列(转载来源Aaron.)

    声明:非本文原创文章,转载来源原文链接Aaron. 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAa ...

  5. jQuery源码分析系列——来自Aaron

    jQuery源码分析系列——来自Aaron 转载地址:http://www.cnblogs.com/aaronjs/p/3279314.html 版本截止到2013.8.24 jQuery官方发布最新 ...

  6. [转] jQuery源码分析-如何做jQuery源码分析

    jQuery源码分析系列(持续更新) jQuery的源码有些晦涩难懂,本文分享一些我看源码的方法,每一个模块我基本按照这样的顺序去学习. 当我读到难度的书或者源码时,会和<如何阅读一本书> ...

  7. jQuery 源码分析 8: 回头看jQuery的构造器(jQuery.fn,jQury.prototype,jQuery.fn.init.prototype的分析)

    在第一篇jQuery源码分析中,简单分析了jQuery对象的构造过程,里面提到了jQuery.fn.jQuery.prototype.jQuery.fn.init.prototype的关系. 从代码中 ...

  8. 性能测试分享: Jmeter的源码分析main函数参数

    性能测试分享: Jmeter的源码分析main函数参数   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大 ...

  9. jquery源码分析之一前言篇

    1.问:jquery源码分析的版本是什么? 答:v3.2.1 2.问:为什么要分析jquery源码? 答:javascript是一切js框架的基础,jquery.es6.vue.angular.rea ...

随机推荐

  1. AutoFac文档5(转载)

    目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 扫描 autofac可 ...

  2. atitit.XML类库选型及object 对象bean 跟json转换方案

    atitit.XML类库选型及object 对象bean 跟json转换方案 1. XML类库可以分成2大类.标准的.这些类库通常接口和实现都是分开的 1 2. 常见的xml方面的方法 2 2.1.  ...

  3. CentOS安装使用git

    yum install git yum install git-gui (可选) git config --global user.name "gg" git config --g ...

  4. CentOS下的强大的绘图工具 pinta

    [root@ok ~]# yum search pinta Loaded plugins: fastestmirror, refresh-packagekit, security Loading mi ...

  5. 632. Binary Tree Maximum Node【Naive】

    Find the maximum node in a binary tree, return the node. Example Given a binary tree: 1 / \ -5 2 / \ ...

  6. dubbo接口测试

    1.下载所需工具eclipse或intellij idea,下载maven,maven中config/settings.xml中要添加公司(测试人员公司)的maven库,不然被测dubbo服务jar包 ...

  7. 混合模式程序集是针对“v2.0.50727”版的运行时生成的

    混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集. 由于“system.data.sqlite.dll”不完整造成的. 在 ...

  8. 微信小程序 - dialog

    实现了 标题,内容和按钮设置,可动态设置按钮,以及按钮点击事件的回调 可作为component 使用 直接上代码 //遮罩的代码 <viewclass="uiComponent uiC ...

  9. 2015 Multi-University Training Contest 3 1006 Beautiful Set

    Beautiful Set Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5321 Mean: 给出一个集合,有两种计算集合的值的 ...

  10. Jquery动态添加 删除 操作实现

    这是gridView为空数据时显示的表头 下面直接填代码: function Add() { //动态添加行 $("#gridCustomerView").append(" ...