zoukankan      html  css  js  c++  java
  • 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的每一个子集遍历执行。

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

  • 相关阅读:
    POJ1821 Fence 单调队列优化DP
    ZOJ 4114 dp
    2019 Multi-University Training Contest 2
    Fibonacci 矩阵乘法入门
    C
    258. Add Digits
    292. Nim Game
    345. Reverse Vowels of a String
    344. Reverse String
    169. Majority Element
  • 原文地址:https://www.cnblogs.com/wphl-27/p/3627456.html
Copyright © 2011-2022 走看看