您的位置:首页 > 其它

$.each工具函数

2015-09-22 19:46 330 查看
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函数里面第一个参数是键名(数组是下标,对象是键名),第二个参数是键值!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: