jQuery each的实现与call方法的详细介绍
转载原出处: http://www.f2es.com/jquery-each-intro/
先贴上jquery实现each功能的源代码(把常用的call部分提取出来,为了方便理解,就进行了一定的修改)
// A special, fast, case for the most common use of each function( object, function) { if ( object.length == undefined ) { for ( var name in object ) if ( function.call( object[ name ], name, object[ name ] ) === false ) break; } else for ( var i = 0, length = object.length, value = object[0]; i < length && function.call( value, i, value ) !== false; value = object[++i] ){} }
return object; }
each()函数是基本上所有的框架都提供了的一个工具类函数,通过它,你可以遍历对象、数组的属性值并进行处理。
jQuery和jQuery对象都实现了该方法,对于jQuery对象,只是把each方法简单的进行了委托:把jQuery对象作为第一个参数传递给jQuery的each方法。换句话说:jQuery提供的each方法是对参数一提供的对象的中所有的子元素逐一进行方法调用。而jQuery对象提供的each方法则是对jQuery内部的子元素进行逐个调用。
简单的可以理解为
//当我们使用object.each(function(){..})时,实际是进行的调用是 for(var i = i;i<object.length;i++){ var value = object[i]; //function中的this指向value,传入的参数为object的索引和索引处的值 function.call(value,i,value); }
从each传入的参数说起
object就是调用each方法的对象,function就是每一个object都要执行的方法
在了解each实现之前,我们需要了解这个call方法
应用于:Function 对象 调用一个对象的一个方法,以另一个对象替换当前对象。 call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 参数:thisObj -可选项,将被用作当前对象的对象。 arg1, arg2, , argN -可选项,将被传递方法参数序列。
说明 call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
简单的例子一个:
function Class1() { this.name = “class1″; //js闭包 this.showName = function() { alert(this.name); } }
function Class2() { this.name = “class2″; } var c1 = new Class1(); var c2 = new Class2(); c1.showName.call(c2);
c1.showName.call(c2)中call方法把c1的方法放到了c2上执行,因为call方法替换的是函数内部this.name = “class2″后执行的方法,也就是说
执行c1.showName.call(c2)等同于执行
function Class2() { this.name = “class2″;
this.showName = function() { alert(this.name); }
}
那么回到
//当我们使用object.each(function(){..})时,实际是进行的调用是 for(var i = i;i<object.length;i++){ var value = object[i]; //function中的this指向value,传入的参数为object的索引和索引处的值 function.call(value,i,value); }
因为function是我们要为object的每一个子集执行的方法,通过function.call(value,i,value)之后,我们把fuction的方法赋予了value,也就是object[i],通过for循环来执行从object索引为0到object.length-1的子集。
我们在实际应用的时候
$obj.each(func);
实际上就是把func通过call的方法给$obj的每一个子集遍历执行。
自己的语言表达能力还不是很好,如果觉得表达有误的可以指出来