首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

【抄】jQuery each的兑现与Function 对象的call方法的详细介绍

2012-09-21 
【抄】jQuery each的实现与Function 对象的call方法的详细介绍先贴上jquery实现each功能的源代码(把常用的ca

【抄】jQuery each的实现与Function 对象的call方法的详细介绍
先贴上jquery实现each功能的源代码(把常用的call部分提取出来,为了方便理解,就进行了一定的修改)

 

// A special, fast, case for the most common use of eachfunction( 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的每一个子集遍历执行。

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

热点排行