$.each工具函数

来源:互联网 发布:网络正常守望先锋卡 编辑:程序博客网 时间:2024/06/07 17:34

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函数里面第一个参数是键名(数组是下标,对象是键名),第二个参数是键值!

0 0
原创粉丝点击