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 相关文章推荐
我的javascript 函数链之演变
Apr 07 Javascript
js实现select组件的选择输入过滤代码
Oct 14 Javascript
node.js中的fs.fstatSync方法使用说明
Dec 15 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
Sep 01 Javascript
微信小程序  简单实例(阅读器)的实例开发
Sep 29 Javascript
JavaScript自定义分页样式
Jan 17 Javascript
判断滚动条滑到底部触发事件(实例讲解)
Nov 15 Javascript
详细分析单线程JS执行问题
Nov 22 Javascript
从零开始搭建webpack+react开发环境的详细步骤
May 18 Javascript
JavaScript对象的特性与实践应用深入详解
Dec 30 Javascript
JavaScript(js)处理的HTML事件、键盘事件、鼠标事件简单示例
Nov 19 Javascript
使用Vue生成动态表单
Nov 26 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使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
laravel Task Scheduling(任务调度)在windows下的使用详解
2019/10/22 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
为调试JavaScript添加输出窗口的代码
2010/02/07 Javascript
JQuery中extend的用法实例分析
2015/02/08 Javascript
js实现发送验证码后的倒计时功能
2015/05/28 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
谈一谈js中的执行环境及作用域
2016/03/30 Javascript
微信小程序 Video API实例详解
2016/10/02 Javascript
jQuery使用正则表达式替换dom元素标签用法示例
2017/01/16 Javascript
AngularJS基于provider实现全局变量的读取和赋值方法
2017/06/28 Javascript
jquery ztree实现右键收藏功能
2017/11/20 jQuery
详解如何在项目中使用jest测试react native组件
2018/02/09 Javascript
JavaScript动态加载重复绑定问题
2018/04/01 Javascript
如何在vue里面优雅的解决跨域(路由冲突问题)
2019/01/20 Javascript
vue路由--网站导航功能详解
2019/03/29 Javascript
vue中typescript装饰器的使用方法超实用教程
2019/06/17 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
Python图像灰度变换及图像数组操作
2016/01/27 Python
简单的python后台管理程序
2017/04/13 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
2018/05/24 Python
Python Requests库基本用法示例
2018/08/20 Python
python 利用pandas将arff文件转csv文件的方法
2019/02/12 Python
Numpy之reshape()使用详解
2019/12/26 Python
通过实例了解Python异常处理机制底层实现
2020/07/23 Python
利用CSS3实现圆角的outline效果的教程
2015/06/05 HTML / CSS
捷克母婴用品购物网站:Feedo.cz
2020/12/28 全球购物
《在大海中永生》教学反思
2014/02/24 职场文书
学生评语大全
2014/04/18 职场文书
计算机应用应届生求职信
2014/07/12 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
医院办公室主任岗位职责
2015/04/01 职场文书
Go语言实现Base64、Base58编码与解码
2021/07/26 Golang
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫
Java版 单机五子棋
2022/05/04 Java/Android