`
adamed
  • 浏览: 183815 次
社区版块
存档分类
最新评论

jQuery源码历代记2

阅读更多

jQuery源码历代记1传送门 http://adamed.iteye.com/blog/1426963

 

前面详述了jQuery构造器中size和get的源码。

下面介绍下一个构造器中的方法each:

 

each : function( fn , args ) {
        return jQuery.each( this , fn , args );
}

 从源码中可以看出该方法就是直接调用jQuery工具方法each。

 

我们先简单看下这个方法(jQuery工具方法后在后面专门篇章进行详解,但由于jQuery.each()在很多地方使用到,所以再此先对其进行详解):

 

each : function( obj , fn , args ) {
        if ( obj.length == undefined ){
                for ( var i in obj ){
                        fn.apply( obj[ i ] , args || [ i , obj[ i ] ] );
                }
        }else{
                for ( var i = 0; i < obj.length; i++ ){
                        fn.apply( obj[ i ] , args || [ i , obj[ i ] ] );
                 }
          }
          return obj;
}

 这段代码很简洁,作用也很明显就是对obj集合中的每一个对象执行fn方法。

 

我们先看一下API中对jQuery.each(collection, callback(indexInArray, valueOfElement) )方法的描述:

 

Description: A generic iterator function, which can be used to seamlessly iterate over both objects and arrays. Arrays and array-like objects with a length property (such as a function's arguments object) are iterated by numeric index, from 0 to length-1. Other objects are iterated via their named properties. 
 

 

简单翻译一下:这是一个通用的迭代函数,它可以用来无缝迭代数组及对象。数组以及带有length属性这样的准数组对象(例如function中的arguments对象)是通过索引数值进行迭代的(从0到length-1)。其他对象是通过他们的属性名进行迭代的。

 

前面已经说过了,理解一个function设计原理先看它的使用方法。

 

对于jQuery.each()的实现源码的理解要从这个方法的使用开始入手,还是看API:

 

如果jQuery.each()方法的第一个参数是一个数组,则回调function的第一个参数是数组的索引。

 

$.each([52, 97], function(index, value) { 
  alert(index + ': ' + value); 
});//得到结果:0:52    1:97 

 

 若jQuery.each()方法的第一个参数传递的是Js对象(类似于JSON对象)则回调function的第一个参数是对象的属性名:

 

var map = {'flammable': 'inflammable','duh': 'no duh'};
$.each(map, function(key, value) {alert(key + ': ' + value);});
//得到结果:flammable:inflammable    duh:no duh

 PS:我们可以通过在回调函数中return false;来结束each方法的循环过程。return 任何非false的值均相当于执行continue,立刻进入下一个循环执行的过程。(1.2以后的版本的功能,参考下面的源码)

 

好了,明白了使用方法以后我们看下jQuery构造器的each方法中最最关键也是最可能不明白的一句代码:

fn.apply( obj[ i ] , args || [ i , obj[ i ] ] );

为了容易理解,我们拆分下API源码并举例:

 

var tempFunction = function(index, value) { alert(index + ': ' + value); };

$.each([52, 97], tempFunction);

 

调用each方法时执行的是:

   for ( var i in obj ){ fn.apply( obj[ i ] , args || [ i , obj[ i ] ] ); }

我们以第一次迭代为例,i=0  obj为[52, 97],obj[i]为52(注意这里是1个对象)

 

循环体执行时相当于tempFunction.apply(52,[0,52]) 也就是相当于执行 52.tempFunction(0,52)。所以在tempFunction中获取this时拿到的是52.

 

参考API中的描述:

 

 

Description:  In the case of an array, the callback is passed an array index and a corresponding array value each time. (The value can also be accessed through the this keyword, but Javascript will always wrap the this value as an Object even if it is a simple string or number value.) The method returns its first argument, the object that was iterated.
 

 

 简单翻译就是例子中的52在调用tempFunction时先被封装成了Object。(^_^翻译的简单吧。)

 //********************************我是成长的分界线*****************************

jQuery的each方法在jQuery 1.2以后实现方式重构为(为了理解方便我添加了一些大括号):

 

 

each: function( object, callback, args ) {
     var name, i = 0, length = object.length;
     if ( args ) {
     //*****这里省略了一些代码******
     } else {
         if ( length == undefined ) {
              for ( name in object ){
                  if ( callback.
                     call( object[ name ], name, object[ name ] ) === false ){
                       break;
                 }
             }
        } else{
          for ( var value = object[0]; i < length &&
                               callback.call( value, i, value ) !== false; 
                               value = object[++i] ){
                   //do nothing
           }
        }
        return object;
}
 

 

其实只是把apply改成call了,数组for循环时把执行那个地方放在判断区了。。核心思想没啥变化。。

 //*******************************这是传送门分割线******************************

我们回到jQuery 1.0构造器each方法这边来。

通过return jQuery.each( this , fn , args );我们看出来jQuery对象的each只是迭代jQuery对象本身的各个属性。

 

 

分享到:
评论

相关推荐

    jQuery源码 jQuery源码 jQuery源码

    jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码jQuery源码...

    JQuery源码详细中文注释_Jquery源码分析_

    《jQuery源码深度解析》 jQuery,作为一款广泛使用的JavaScript库,因其简洁的API和强大的功能,深受开发者喜爱。本文将深入探讨jQuery 1.2.6版本的源码,结合其中的中文注释,帮助读者理解其内部机制,提升...

    Jquery源码分析 源码

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

    jQuery源码分析系列.pdf

    ### jQuery源码分析系列知识点概览 #### 一、总体架构与核心概念 - **前言开光**:介绍分析jQuery源码的目的和价值,强调通过深入研究源码,可以学习到先进的设计理念和实践技巧。 - **总体架构**:解析jQuery的...

    jquery源码,3.7.0版本

    jquery源码,3.7.0版本

    jquery源码分析

    jquery源码分析,包括入口技术,选择器入口,以及在选择器使用的时候需要注意的优化思路

    Head First jquery源码

    《Head First jQuery源码》是一本深入解析jQuery库的书籍,其内容主要涵盖了jQuery的核心功能、设计理念以及实现机制。jQuery是JavaScript的一个库,它极大地简化了网页中的DOM操作、事件处理、动画效果以及Ajax交互...

    jquery源码框架解读

    2. **事件处理**:jQuery封装了事件处理函数,如`.on()`, `.off()`, `.trigger()`等,使得事件绑定和解绑更为便捷。它还支持事件委托,通过`.delegate()`或`.on()`的代理模式,可以在动态生成的元素上绑定事件。 3....

    jQuery源码+中文详细注解

    ### jQuery源码+中文详细注解 #### 一、引言 本文档是对jQuery源码进行中文注解的详细介绍,旨在帮助广大前端开发者更深入地理解jQuery的核心逻辑和技术要点。通过对核心部分的逐行注解,可以更好地掌握jQuery的...

    Head First jQuery源码

    2. **链式操作**:jQuery对象返回的是一个jQuery实例,这意味着每个方法调用后都可以直接连接其他方法,如`$("#myDiv").hide().fadeIn()`,这种设计使得代码更加紧凑。 3. **DOM操作**:jQuery提供了丰富的API用于...

    jquery源码(1.4)

    jquery最新源码jquery最新源码jquery最新源码

    jQuery源码分析-插件

    jQuery源码分析-插件

    jQuery源码分析视频教程

    jQuery源码分析视频教程总计116课,按照jquery每个区段实现的内容,精确地讲解源码中是怎么实现我们开发中用到的jquery得方法的

    jQuery源码分析系列中文PDF版

    资源名称:jQuery源码分析系列 中文PDF版内容简介:jQuery凭借简洁的语法和跨平台的兼容性,极大地简化了Javascript开发开发人员遍历HTML文档、操作DOM、处理事件、执行动画和开发Ajax的操作。其独特而又优雅...

    jquery api, jquery ui api, jquery源码分析

    **jQuery API** jQuery 是一款广泛使用的 JavaScript 库,它的出现极大地简化了网页的 ...通过学习jQuery API、jQuery UI API以及源码分析,开发者不仅可以提升开发效率,还能编写出更高效、更优雅的JavaScript代码。

    锋利的jQuery 源码

    《锋利的jQuery源码》是一本专注于深入解析jQuery库源码的专业书籍,旨在帮助开发者理解并掌握jQuery的核心原理和实现机制。jQuery是JavaScript库中的一个里程碑,它极大地简化了DOM操作、事件处理、动画效果以及...

    jQuery 源码+实例+注释

    **jQuery 源码分析与实例详解** jQuery 是一个广泛使用的 JavaScript 库,它极大地简化了 JavaScript 的 DOM 操作、事件处理、动画制作以及 AJAX 交互。本教程旨在通过源码解析、实例演示和详细注释,帮助新手快速...

    jQuery源码解读

    在源码解读中,我们可以看到jQuery的设计思路和实现机制。 首先,jQuery的核心设计是基于JavaScript的闭包特性,以避免命名冲突。整个jQuery库被包裹在一个立即执行的匿名函数中,这样可以确保其中定义的所有函数和...

Global site tag (gtag.js) - Google Analytics