JQuery源码浅析之工具-each

1.介绍

  each是jQuery中一个重要的工具方法.用来遍历数组或者对象,并且执行回调.

2.使用方法

each( obj, callback, args )

obj: 数组或者普通对象(可以认为是一个集合)

callback:回调函数, 遍历obj中的每一个元素就会把该元素作为参数(作为回调函数的this)调用回调函数,callback可以这样写,

             function callback(objItem) {

                     console.log(objItem);

             }

args: 调用回调callback的附加参数,可以这样写回调

             function callback(objItem, args) {

                     console.log(objItem + '   ' + args );

             }

demo:

//each接受2个参数, 数组[1,2,3],回调函数
$.each([1,2,3], function(key, value){
  console.log("[" + key + "]=" + value);
  return false;
});
//输出:
[0]=1
[1]=2
[2]=3
[1,2,3]
//可以看到回调函数具有两个参数,key是数组的索引,value是对应的元素
 
//each接受3个参数, 数组[1,2,3],回调函数,一个额外的参数数组args=[4,5]
$.each([1,2,3], function(arg1, arg2){
  console.log(this + "," + arg1 + "," + arg2);
}, [4, 5]);
//输出:
1,4,5
2,4,5
3,4,5
[1,2,3]
//可以看到回调函数的两个参数就是each的第三个参数args,在函数里边的this就是遍历元素自己


3.jQuery源码

jQuery.extend({
	//...省略其他
	// args is for internal usage only
	each: function( obj, callback, args ) {
		var value,
			i = 0,
			length = obj.length,
			//判断obj是不是数组,数组和普通对象的遍历不一样,在js中数组使用下标遍历array[index],
            //普通对象使用obj[attribute] -> value,有点类似Java 的Map的意思. 
			//在最新的JS版本中将列入新的集合规范,其中就包括Map,当前,js不存在Map集合对象
			isArray = isArraylike( obj );

		if ( args ) {
			if ( isArray ) {
				for ( ; i < length; i++ ) {
					value = callback.apply( obj[ i ], args );

					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 ) {
				//含简单,数组按照下标遍历数组元素
				for ( ; i < length; i++ ) {
					value = callback.call( obj[ i ], i, obj[ i ] );

					if ( value === false ) {
						break;
					}
				}
			} else {//如果是对象,则遍历对象中的属性,例如json格式的数据解析,[{id:001, name:zhangsan}, {id:002, name:lisi}]
				for ( i in obj ) {
					value = callback.call( obj[ i ], i, obj[ i ] );
                    //在回调函数中每一次调用返回false,会结束后面的元素遍历
					if ( value === false ) {
						break;
					}
				}
			}
		}

		return obj;
	},
	//...省略其他
});



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值