$.each工具函数
2015-09-22 19:46
330 查看
each用法举例:
用法1:提前退出循环
each函数源码分析
总结:(1)如果传入了第三个参数那么each函数里面的参数就是就是第三个参数对象,同时对前面键值的访问只能通过this访问
(2)如果没有传入第三个参数,那么each函数里面第一个参数是键名(数组是下标,对象是键名),第二个参数是键值!
用法1:提前退出循环
//如果有return false那么只会遍历出来第一个元素,也就是[0]=1 $.each([1,2,3], function(key, value){ alert("[" + key + "]=" + value);//打印[0]=1 return false; }); });用法2:each方法如果传入了第三个参数,那么要对前面的值进行访问只能用this了,回调函数中参数就是第三个参数的值
// 如果传入第三个参数,那么this指向前面那个object第n个属性,n表示迭代次数(所以下面的案例输出:[1,4,5];[2,4,5];[3,4,5]) $.each([1,2,3], function(arg1, arg2){ alert("this->"+ {}.toString.call(this));//直接是[object Number]也就是对前面的1,2,3进行了基本类型封装 alert("arg1->"+ typeof arg1);//这里的arg1就是后面的4,arg2就是后面的5 alert("arg2->"+typeof arg2); }, [4, 5]);用法3:如果只有两个参数那么this就是前面的元素(不管三个参数还是两个参数this都是对前面元素的引用,只是两个参数时候除了this还可以用回调函数的参数访问)
//this指向键值,第一个参数是key,第二个是value,第三个是额外参数 //打印4,5,3 $.each([4,5,3], function(arg1, arg2,arg3){ alert(this); });用法4:我们的jQuery.each方法和each,map实例方法还有is,not,filter等传入函数作为参数的情况下,是几个变态的方法,它在回调函数中第一个参数是下标,第二个参数是元素,其它方法全部是第一个是元素,第二个是下标!
//arg1是index,arg2是value $.each([4,5,3], function(arg1, arg2,arg3){ alert("arguments[0]->"+arguments[0]+"arguments[1]->"+arguments[1]); });用法5:下标+元素
//这种方式:只会输出0,4;1,5因为到遍历3的时候return false那么直接后面的元素不会进行调用callback函数了 $.each([4,5,3], function(arg1, arg2){ if(arg1===2) { return false; } alert("arg1->"+arg1+"arg2->"+arg2); });
each函数源码分析
each: function( obj, callback, args ) { var value, i = 0, length = obj.length, isArray = isArraylike( obj ); //如果传入了第三个参数(这里可以知道undefined在if语句变成了false) if ( args ) { if ( isArray ) { //如果是类数组对象,那么开始遍历这个对象,然后对每一个对象调用callback方法,给callback里面传入的参数是: //如果是第i次循环则为:obj[i],以及第三个参数的对象,第三个参数可以是类数组对象 for ( ; i < length; i++ ) { value = callback.apply( obj[ i ], args ); //this指向obj[i],也就是第一个参数的值(见上面的例子2),同时会把args类数组作为单个的对象逐个封装到函数参数中间 //alert(Math.max.apply(null,[1,2,7,3]));就是这个道理 if ( value === false ) { break; } } } else { for ( i in obj ) { value = callback.apply( obj[ i ], args ); if ( value === false ) { break; } } } // A special, fast, case for the most common use of each //如果没有传入第三个参数 } else { //同时也是类数组对象 if ( isArray ) { //那么用call而不是apply方法来调用,分别传入参数 for ( ; i < length; i++ ) { value = callback.call( obj[ i ], i, obj[ i ] ); //如果有一个在函数执行的时候直接return false,那么就结束循环,下面的都不会调用callback函数了! if ( value === false ) {//如果返回false,那么直接退出循环 break; } } } else { //如果没有传入第三个参数,同时传入的也不是类数组对象,那么直接没有函数调用一个对象 for ( i in obj ) { value = callback.call( obj[ i ], i, obj[ i ] ); if ( value === false ) { break; } } } } return obj; }
总结:(1)如果传入了第三个参数那么each函数里面的参数就是就是第三个参数对象,同时对前面键值的访问只能通过this访问
(2)如果没有传入第三个参数,那么each函数里面第一个参数是键名(数组是下标,对象是键名),第二个参数是键值!
相关文章推荐
- 博客伊始
- 广告英文术语大全
- Android 百度地图(二)——地图切换、定位、添加覆盖物、搜索位置、连线
- HDU 3874 Necklace(树状数组离线处理)
- 个人项目编程实验
- poj1222 EXTENDED LIGHTS OUT
- More Effective C++ 条款15 了解异常处理(exception handling)的成本
- iOS中UISearchBar(搜索框)使用总结
- android环境搭建
- HDOJ1015.Safecracker
- 二分————
- 用MATLAB将多个文件夹内的某些文件汇总到另一个文件夹
- 7.Python进阶_函数对象
- EXTJS 自学2 使用面板
- 四则运算题目项目笔记
- 安卓开机动画的制作
- [iOS]setValue和setObject区
- POJ 1797 【一种叫做最大生成树的很有趣的贪心】【也可以用dij的变形思想~】
- eclipse安装tomcat插件
- 第4周—项目2 建立“单链表”算法库