jQuery each函数源码分析


Posted in Javascript onMay 25, 2016

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

代码

/*! 
* jQuery源码分析-each函数 
* jQuery版本:1.4.2 
* 
* ---------------------------------------------------------- 
* 函数介绍 
* 
* each函数通过jQuery.extend函数附加到jQuery对象中: 
* jQuery.extend({ 
* each: function() {} 
* }); 
* 如果对jQuery.extend函数源码还不了解,可以参考《jQuery源码分析-extend函数》一文 
* 
* jQuery.each方法用于遍历一个数组或对象,并对当前遍历的元素进行处理 
* jQuery.each方法可以为处理函数增加附带的参数(带参数与不带参数的回调使用方法不完全一致) 
* 
* ---------------------------------------------------------- 
* 使用说明 
* each函数根据参数的类型实现的效果不完全一致: 
* 1、遍历对象(有附加参数) 
* $.each(Object, function(p1, p2) { 
* this; //这里的this指向每次遍历中Object的当前属性值 
* p1; p2; //访问附加参数 
* }, ['参数1', '参数2']); 
* 
* 2、遍历数组(有附件参数) 
* $.each(Array, function(p1, p2){ 
* this; //这里的this指向每次遍历中Array的当前元素 
* p1; p2; //访问附加参数 
* }, ['参数1', '参数2']); 
* 
* 3、遍历对象(没有附加参数) 
* $.each(Object, function(name, value) { 
* this; //this指向当前属性的值 
* name; //name表示Object当前属性的名称 
* value; //value表示Object当前属性的值 
* }); 
* 
* 4、遍历数组(没有附加参数) 
* $.each(Array, function(i, value) { 
* this; //this指向当前元素 
* i; //i表示Array当前下标 
* value; //value表示Array当前元素 
* }); 
* ---------------------------------------------------------- 
* 
*/ 
//jQuery.each(), $.each() 
//@param {Object}|{Array} object 需要遍历处理的对象或数组 
//@param {Function} callback 遍历处理回调函数 
//@param {Array} args callback回调函数的附加参数 
each: function(object, callback, args){ 
//当需要遍历的是一个对象时,name变量用于记录对象的属性名 
var name, 
//当需要遍历的是一个数组时,i变量用于记录循环的数组下标 
i = 0, 
//遍历数组长度,当需要遍历的对象是一个数组时存储数组长度 
//如果需要遍历的是一个对象,则length === undefined 
length = object.length, 
//检查第1个参数object是否是一个对象 
//根据object.length排除数组类型,根据isFunction排除函数类型(因为函数也是对象) 
isObj = length === undefined || jQuery.isFunction(object); 
//回调函数具有附加参数时,执行第一个分支 
//if(!!args) { 
if (args) { 
//需要遍历的是一个对象 
if (isObj) { 
//遍历对象属性,name是对象的属性名,再函数顶部已声明 
//许多人不太习惯for(var name in object)方式,如果不进行声明,则name就会被定义为全局变量 
for (name in object) { 
//调用callback回调函数,且回调函数的作用域表示为当前属性的值 
//如:callback() { this; //函数中的this指向当前属性值 
//将each的第3个参数args作为回调函数的附加参数 
if (callback.apply(object[name], args) === false) { 
//如果在callback回调函数中使用return false;则不执行下一次循环 
break; 
} 
} 
} 
//需要遍历的是一个数组 
else { 
//循环长度,循环变量i在函数顶部已定义 
//循环变量的自增在循环内部执行 
for (; i < length;) { 
//调用callback函数,与上面注释的callback调用一致 
//此处callback函数中的this指向当前数组元素 
if (callback.apply(object[i++], args) === false) { 
break; 
} 
} 
} 
} 
//回调函数没有附加参数时,执行第二个分支 
else { 
//需要遍历的是一个对象 
if (isObj) { 
//循环对象的属性名,name在函数顶部已定义 
for (name in object) { 
//调用callback回调函数 
//在不带参数的对象遍历中,作用域表示为当前属性的值 
//且回调函数包含两个参数,第一个数当前属性名,第二个是当前属性值 
//我觉得这句代码修改一下会更好用:if(callback.call(object, name, object[name]) === false) { 
if (callback.call(object[name], name, object[name]) === false) { 
//如果在callback回调函数中使用return false;则不执行下一次循环 
break; 
} 
} 
} 
//需要遍历的是一个数组 
else { 
//这里的for写法有点BT,解释为: 
//var value = object[0]; 
//for(; i < length;) { 
// if(false === callback.call(value, i, value)) { 
// break; 
// } 
// value = object[++i]; 
//} 
//同样,我觉得这里的代码稍加修改会更好用: 
//for (; i < length && false !== callback.call(object, i, object[i++]);) { 
//} 
for (var value = object[0]; i < length && callback.call(value, i, value) !== false; value = object[++i]) { 
} 
} 
} 
//这里返回遍历的对象或数组,但object没有被更改,因此一般不给$.each()赋值 
//但是如果按照我在注释中所修改的写法来使用,且在callback回调函数中对this(即对object的引用)进行了修改 
//则这里返回的object是被修改后的对象或数组 
return object; 
}
Javascript 相关文章推荐
offsetParent 算法分析
Apr 05 Javascript
举例讲解AngularJS中的模块
Jun 17 Javascript
jQuery实现文件上传进度条特效
Aug 12 Javascript
关于session和cookie的简单理解
Jun 08 Javascript
微信小程序 教程之注册页面
Oct 17 Javascript
微信小程序实战之上拉(分页加载)效果(2)
Apr 17 Javascript
jQuery Form插件使用详解_动力节点Java学院整理
Jul 17 jQuery
vue+springboot前后端分离实现单点登录跨域问题解决方法
Jan 30 Javascript
webpack打包node.js后端项目的方法
Mar 10 Javascript
vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
Oct 24 Javascript
Swiper.js实现移动端元素左右滑动
Sep 08 Javascript
JavaScript中关于预编译、作用域链和闭包的理解
Mar 31 Javascript
jQuery中的each()详细介绍(推荐)
May 25 #Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
May 25 #Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
May 25 #Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
May 25 #Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
May 25 #Javascript
js的form表单提交url传参数(包含+等特殊字符)的两种解决方法
May 25 #Javascript
jQuery获取复选框被选中数量及判断选择值的方法详解
May 25 #Javascript
You might like
《PHP编程最快明白》第三讲:php数组
2010/11/01 PHP
微信自定义菜单的创建/查询/取消php示例代码
2016/08/05 PHP
PHP中SQL查询语句的id=%d解释(推荐)
2016/12/10 PHP
Ajax+PHP实现的模拟进度条功能示例
2019/02/11 PHP
PhpSpreadsheet设置单元格常用操作汇总
2020/11/13 PHP
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
jquery图片放大功能简单实现
2013/08/01 Javascript
jquery动态加载select下拉框示例代码
2013/12/10 Javascript
Js为表单动态添加节点内容的方法
2015/02/10 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
2015/12/25 Javascript
AngularJS中的Directive实现延迟加载
2016/01/25 Javascript
JQuery学习总结【一】
2016/12/01 Javascript
jQuery获取table下某一行某一列的值实现代码
2017/04/07 jQuery
JavaScript基础心法 数据类型
2018/03/05 Javascript
微信小程序制作扭蛋机代码实例
2019/09/24 Javascript
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
Vue自定义多选组件使用详解
2020/09/08 Javascript
[02:56]DOTA2上海特锦赛小组赛解说FreeAgain采访花絮
2016/02/27 DOTA
python 写的一个爬虫程序源码
2016/02/28 Python
两个命令把 Vim 打造成 Python IDE的方法
2016/03/20 Python
python将unicode转为str的方法
2017/06/21 Python
python字典DICT类型合并详解
2017/08/17 Python
python3大文件解压和基本操作
2017/12/15 Python
windows下 兼容Python2和Python3的解决方法
2018/12/05 Python
使用Python的OpenCV模块识别滑动验证码的缺口(推荐)
2019/05/10 Python
JAVA SWT事件四种写法实例解析
2020/06/05 Python
Python如何实现线程间通信
2020/07/30 Python
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
Koral官方网站:女性时尚运动服
2019/04/10 全球购物
Java平台和其他软件平台有什么不同
2015/06/05 面试题
工业学校毕业生自荐书
2014/01/03 职场文书
会员卡清退活动总结
2014/08/27 职场文书
2014法院四风问题对照检查材料思想汇报
2014/10/04 职场文书
员工自我工作评价
2015/03/06 职场文书
五一放假通知怎么写
2015/08/18 职场文书
2019银行员工个人工作自我鉴定
2019/06/27 职场文书