先来看看jQuery.each代码 jQuery.fn.init指南
each: function( object, callback, args ) {
var name, i = 0, length = object.length;
if ( args ) {
if ( length == undefined ) {
....//1
break;
} else
....//2
break;
} else {
if ( length == undefined ) {
....//3
break;
} else
...//4
}
return object;
}
args是用来供内部使用的,我来从1,2,3,4一个一个分析
//1 存在args,但是没有length属性object Spring
for ( name in object )
if ( callback.apply( object[ name ], args ) === false )
break;
遍历object里面的属性然后执行callback方法,而且将args注入进来,当返回值为false的情况下终止循环,注意是用的"===",返回0,"false"是无效的
//2 和 //1一样,只是他是一个含有length的object,便利的方式不同而已,毕竟for要比foreach速度上要快
//3 外部使用,无length属性
for ( name in object )
if ( callback.call( object[ name ], name, object[ name ] ) === false )
break;
这个就看的很清楚了,当我们使用
$.each(["aa","bb"],function(i,n){ alert(n == this)}) //true
就可以知道其原因了
//4
for ( var value = object[0];i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
看似好像和前面不一样,其实这只是一种幻觉,他只是把工作全部转移到for里面去了,充分的利用了语法,可读性下去了,性能没测不好评论,不过这种花式写法我还是推崇的,毕竟写代码是个枯燥无味的,有时候能利用智慧玩点花样找点乐子,也是一种生活态度