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的每一个子集遍历执行。

自己的语言表达能力还不是很好,如果觉得表达有误的可以指出来

原文地址:https://www.cnblogs.com/wphl-27/p/3627456.html