`

jquery的each()方法分析

阅读更多
/*!  
* jQuery源码分析-each函数 
* jQuery版本:1.4.2 

* ---------------------------------------------------------- 
* 函数介绍 

* each函数通过jQuery.extend函数附加到jQuery对象中: 
* jQuery.extend({ 
*     each: function() {} 
* }); 
* 如果对jQuery.extend函数源码还不了解,可以参考《jQuery源码分析-extend函数》一文 

* jQuery.each方法用于遍历一个数组或对象,并对当前遍历的元素进行处理 
* jQuery.each方法可以为处理函数增加附带的参数(带参数与不带参数的回调使用方法不完全一致) 

* ---------------------------------------------------------- 
* 使用说明 
* each函数根据参数的类型实现的效果不完全一致: 
* 1、遍历对象(有附加参数) 
* $.each(Object, function(p1, p2) { 
*     this;      //这里的this指向每次遍历中Object的当前属性值 
*     p1; p2;    //访问附加参数 
* }, ['参数1', '参数2']); 

* 2、遍历数组(有附件参数) 
* $.each(Array, function(p1, p2){ 
*     this;      //这里的this指向每次遍历中Array的当前元素 
*     p1; p2;    //访问附加参数 
* }, ['参数1', '参数2']); 

* 3、遍历对象(没有附加参数) 
* $.each(Object, function(name, value) { 
*     this;     //this指向当前属性的值 
*     name;     //name表示Object当前属性的名称 
*     value;    //value表示Object当前属性的值 
* }); 

* 4、遍历数组(没有附加参数) 
* $.each(Array, function(i, value) { 
*     this;     //this指向当前元素 
*     i;        //i表示Array当前下标 
*     value;    //value表示Array当前元素 
* }); 
* ---------------------------------------------------------- 

*/ 
//jQuery.each(), $.each()  
//@param {Object}|{Array} object 需要遍历处理的对象或数组  
//@param {Function} callback 遍历处理回调函数  
//@param {Array} args callback回调函数的附加参数  
each: function(object, callback, args){  
 
    //当需要遍历的是一个对象时,name变量用于记录对象的属性名  
    var name,      
      
    //当需要遍历的是一个数组时,i变量用于记录循环的数组下标  
    i = 0,      
      
    //遍历数组长度,当需要遍历的对象是一个数组时存储数组长度  
    //如果需要遍历的是一个对象,则length === undefined  
    length = object.length,      
      
    //检查第1个参数object是否是一个对象  
    //根据object.length排除数组类型,根据isFunction排除函数类型(因为函数也是对象)  
    isObj = length === undefined || jQuery.isFunction(object);  
      
    //回调函数具有附加参数时,执行第一个分支  
    //if(!!args) {  
    if (args) {  
          
        //需要遍历的是一个对象  
        if (isObj) {  
              
            //遍历对象属性,name是对象的属性名,再函数顶部已声明  
            //许多人不太习惯for(var name in object)方式,如果不进行声明,则name就会被定义为全局变量  
            for (name in object) {  
              
                //调用callback回调函数,且回调函数的作用域表示为当前属性的值  
                //如:callback() {  this; //函数中的this指向当前属性值  
                //将each的第3个参数args作为回调函数的附加参数  
                if (callback.apply(object[name], args) === false) {  
                  
                    //如果在callback回调函数中使用return false;则不执行下一次循环  
                    break;  
                }  
            }  
        }  
        //需要遍历的是一个数组  
        else {  
          
            //循环长度,循环变量i在函数顶部已定义  
            //循环变量的自增在循环内部执行  
            for (; i < length;) {  
              
                //调用callback函数,与上面注释的callback调用一致  
                //此处callback函数中的this指向当前数组元素  
                if (callback.apply(object[i++], args) === false) {  
                    break;  
                }  
            }  
        }  
          
    }  
    //回调函数没有附加参数时,执行第二个分支  
    else {  
      
        //需要遍历的是一个对象  
        if (isObj) {  
          
            //循环对象的属性名,name在函数顶部已定义  
            for (name in object) {  
              
                //调用callback回调函数  
                //在不带参数的对象遍历中,作用域表示为当前属性的值  
                //且回调函数包含两个参数,第一个数当前属性名,第二个是当前属性值  
                //我觉得这句代码修改一下会更好用:if(callback.call(object, name, object[name]) === false) {  
                if (callback.call(object[name], name, object[name]) === false) {  
                  
                    //如果在callback回调函数中使用return false;则不执行下一次循环  
                    break;  
                }  
            }  
        }  
        //需要遍历的是一个数组  
        else {  
            //这里的for写法有点BT,解释为:  
            //var value = object[0];  
            //for(; i < length;) {  
            //    if(false === callback.call(value, i, value)) {  
            //        break;  
            //    }  
            //    value = object[++i];  
            //}  
            //同样,我觉得这里的代码稍加修改会更好用:  
            //for (; i < length && false !== callback.call(object, i, object[i++]);) {  
            //}  
            for (var value = object[0]; i < length && callback.call(value, i, value) !== false; value = object[++i]) {  
            }  
        }  
    }  
      
    //这里返回遍历的对象或数组,但object没有被更改,因此一般不给$.each()赋值  
    //但是如果按照我在注释中所修改的写法来使用,且在callback回调函数中对this(即对object的引用)进行了修改  
    //则这里返回的object是被修改后的对象或数组  
    return object;  
分享到:
评论

相关推荐

    jQuery each函数源码分析_.docx

    《jQuery each函数源码分析》 jQuery库中的`each`函数是其核心功能之一,它提供了遍历数组和对象的能力,使得开发者能够方便地对集合中的每个元素进行操作。在这个文档中,我们将深入探讨`each`函数的源码,了解其...

    Jquery源码分析 源码

    《jQuery源码分析》 jQuery,作为一款广泛使用的JavaScript库,极大地简化了DOM操作、事件处理、动画制作以及Ajax交互。深入理解其源码对于提升JavaScript编程技能和优化前端性能至关重要。本文将从核心概念、设计...

    jQuery中each遍历的三种方法实例分析

    本文详细介绍了 jQuery 中的 each() 方法,用于遍历匹配的元素集合,即根据选择器选取的元素集合,并针对每个元素执行一个函数。 在 jQuery 中,each() 方法主要有三种遍历方式: 1. 使用选择器选取元素,然后通过...

    jQuery源码详细分析中文注释

    《jQuery源码详细分析中文注释》是一份深入解析jQuery库源码的宝贵资源,它为开发者提供了理解这个广泛使用的JavaScript库内部工作机制的机会。jQuery以其简洁的API和强大的功能深受前端开发者的喜爱,但其背后的...

    jQuery源码分析(1.7)

    ### jQuery源码分析关键知识点详解 #### 一、前言 在深入了解jQuery源码之前,有必要先简要介绍一下jQuery的基本情况及其对JavaScript编程领域的重要意义。jQuery作为一个轻量级、功能丰富的JavaScript库,在Web...

    jQuery.js执行过程分析

    这些方法包括但不限于`each`、`find`等,它们构成了jQuery的基础功能。通过这种方式,所有由jQuery构造的实例都可以访问这些方法。 4. **静态方法扩展**: `jQuery.extend`是一个静态方法,用于扩展jQuery自身的...

    jquery 源码分析

    5. **遍历和过滤**:如`.each()`, `.filter()`, `.map()`等方法帮助开发者处理元素集合。 #### 四、深入源码分析 为了更好地理解jQuery的工作原理,接下来我们将对jQuery的一些核心部分进行深入分析。 ##### 4.1 ...

    Jquery1.2.6源码分析

    2. `.each()`: 遍历jQuery对象时,使用`.each()`比循环遍历数组更高效,因为它避免了额外的DOM查询。 七、插件扩展 jQuery的可扩展性是其流行的关键,开发者可以通过`$.fn.extend()`创建自定义方法,实现个性化的...

    jquery1.43源码分析之工具方法.doc

    ### jQuery 1.4.3 源码分析之工具方法 #### 一、概述 在探讨`jQuery 1.4.3`源码中工具方法的细节之前,有必要了解这些工具方法在整个库中的作用与定位。根据文档的描述,这部分内容主要关注于一些常用的工具方法,...

    jQuery 1.9.1源码分析系列(十四)之常用jQuery工具

    jQuery.each()函数与jQuery对象的each()方法不同,后者是实例方法,但其内部实现最终调用的还是jQuery.each()函数。 在上下文控制方面,jQuery.proxy()函数可以改变一个函数的执行上下文(this指向)。它有两种用法...

    jQuery each函数源码分析

    以下是对`jQuery.each`函数的详细分析: 首先,`jQuery.each`函数有两种主要的用法:遍历对象和遍历数组。对于对象,它会按属性顺序执行回调函数;对于数组,它会按索引顺序执行回调。 1. **遍历对象**:当传入的...

    jQuery源码分析之jQuery.fn.each与jQuery.each用法

    本文实例讲述了jQuery源码分析之jQuery.fn.each与jQuery.each用法。分享给大家供大家参考。具体分析如下: 先上例子,下面代码的作用是:对每个选中的div元素,都给它们添加一个red类 复制代码 代码如下:$(‘div’)....

    139.jQuery源码分析-魔术方法.rar

    《jQuery源码分析——魔术方法》 jQuery,作为一款广泛使用的JavaScript库,以其简洁的API和强大的功能赢得了开发者们的喜爱。在深入理解jQuery的工作原理时,我们常常会遇到一些“魔术方法”,这些方法在特定场景...

    jQuery中each和js中forEach的区别分析

    在JavaScript和jQuery的世界里,遍历数据结构是常见的任务,其中`each`和`forEach`是两种常用的遍历方法。本文将深入分析jQuery中的`each`和JavaScript原生的`forEach`之间的区别。 首先,`forEach`是ECMAScript 5...

    jQuery 1.5 遍历xml节点属性

    需要注意的是,`.attr.each()`并不是jQuery的核心方法,而是对`jQuery.fn.attr`的一个扩展,如在描述中提到的博客文章可能对此进行了定义。 结合"test.html"文件,我们可以创建一个简单的HTML页面来展示这个过程。...

    js/jquery遍历对象和数组的方法分析【forEach,map与each方法】

    主要介绍了js/jquery遍历对象和数组的方法,结合实例形式分析了数组遍历的forEach,map与each方法常见使用技巧,需要的朋友可以参考下

    jQuery权威指南-源代码

    其次详细讲解了jQuery的各种选择器、jQuery操作DOM的方法、jQuery中的事件与应用、jQuery中的动画和特效、Ajax在jQuery中的应用,以及各种常用的jQuery插件的使用方法和技巧...

Global site tag (gtag.js) - Google Analytics