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,作为一款广泛使用的JavaScript库,因其简洁的API和强大的功能,深受开发者喜爱。本文将深入探讨jQuery 1.2.6版本的源码,结合其中的中文注释,帮助读者理解其内部机制,提升...
《jQuery源码分析》 jQuery,作为一款广泛使用的JavaScript库,极大地简化了DOM操作、事件处理、动画制作以及Ajax交互。深入理解其源码对于提升JavaScript编程技能和优化前端性能至关重要。本文将从核心概念、设计...
### jQuery源码分析系列知识点概览 #### 一、总体架构与核心概念 - **前言开光**:介绍分析jQuery源码的目的和价值,强调通过深入研究源码,可以学习到先进的设计理念和实践技巧。 - **总体架构**:解析jQuery的...
jquery源码,3.7.0版本
jquery源码分析,包括入口技术,选择器入口,以及在选择器使用的时候需要注意的优化思路
《Head First jQuery源码》是一本深入解析jQuery库的书籍,其内容主要涵盖了jQuery的核心功能、设计理念以及实现机制。jQuery是JavaScript的一个库,它极大地简化了网页中的DOM操作、事件处理、动画效果以及Ajax交互...
2. **事件处理**:jQuery封装了事件处理函数,如`.on()`, `.off()`, `.trigger()`等,使得事件绑定和解绑更为便捷。它还支持事件委托,通过`.delegate()`或`.on()`的代理模式,可以在动态生成的元素上绑定事件。 3....
### jQuery源码+中文详细注解 #### 一、引言 本文档是对jQuery源码进行中文注解的详细介绍,旨在帮助广大前端开发者更深入地理解jQuery的核心逻辑和技术要点。通过对核心部分的逐行注解,可以更好地掌握jQuery的...
2. **链式操作**:jQuery对象返回的是一个jQuery实例,这意味着每个方法调用后都可以直接连接其他方法,如`$("#myDiv").hide().fadeIn()`,这种设计使得代码更加紧凑。 3. **DOM操作**:jQuery提供了丰富的API用于...
jquery最新源码jquery最新源码jquery最新源码
jQuery源码分析-插件
jQuery源码分析视频教程总计116课,按照jquery每个区段实现的内容,精确地讲解源码中是怎么实现我们开发中用到的jquery得方法的
资源名称:jQuery源码分析系列 中文PDF版内容简介:jQuery凭借简洁的语法和跨平台的兼容性,极大地简化了Javascript开发开发人员遍历HTML文档、操作DOM、处理事件、执行动画和开发Ajax的操作。其独特而又优雅...
**jQuery API** jQuery 是一款广泛使用的 JavaScript 库,它的出现极大地简化了网页的 ...通过学习jQuery API、jQuery UI API以及源码分析,开发者不仅可以提升开发效率,还能编写出更高效、更优雅的JavaScript代码。
《锋利的jQuery源码》是一本专注于深入解析jQuery库源码的专业书籍,旨在帮助开发者理解并掌握jQuery的核心原理和实现机制。jQuery是JavaScript库中的一个里程碑,它极大地简化了DOM操作、事件处理、动画效果以及...
**jQuery 源码分析与实例详解** jQuery 是一个广泛使用的 JavaScript 库,它极大地简化了 JavaScript 的 DOM 操作、事件处理、动画制作以及 AJAX 交互。本教程旨在通过源码解析、实例演示和详细注释,帮助新手快速...
在源码解读中,我们可以看到jQuery的设计思路和实现机制。 首先,jQuery的核心设计是基于JavaScript的闭包特性,以避免命名冲突。整个jQuery库被包裹在一个立即执行的匿名函数中,这样可以确保其中定义的所有函数和...