$.each一般用来遍历一个数组或对象,$.fn.each()就是指jQuery实例可以执行的操作(因为$.fn是jQuery对象的原型)

$.each用来遍历一个数组或对象,并依次执行回掉函数,最后返回传递的数组或对象,以支持链式操作,可以传递三个参数,如下:

  object   待遍历的对象或数组

  callback  要执行的函数,该函数可以带两个参数,分别表示该元素的索引(如果遍历对象则为键名)和值

writer by:大沙漠 QQ:22969969

  args     一个数组,如果设置了该值,则参数2对应的函数里的参数就是该值,一般可以忽略

$.fn.each就是调用调用$.each来实现的,它传入的参数1就是当前对象this

例如:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="http://libs.baidu.com/jquery/1.7.1/jquery.min.js"></script>
</head>
<body>
<p>1</p>
<p>2</p>
<script>
var A = [11,12,13,14,15]
$.each(A,function(index,elem){console.log(index,elem);}) //输出五行信息,分别为:0 11、1 12、2 13、3 14、4 15
$.each(A,function(){console.log(arguments)},[1,2]) //输出五行同样的信息,是一个数组,都是[1,2]
$('p').each(function(i,elem){
console.log(elem.innerHTML); //输出1、2
})
</script>
</body>
</html>

输出如下:

源码分析


$.each是通过$.extend()加载进来的,它的实现如下:

  // args is for internal usage only
each: function( object, callback, args ) { //通用的遍历迭代方法,用于无缝地遍历对象和数组。object是待遍历的对象或数组 args是传给回调函数callback的参数数组
var name, i = 0,
length = object.length,
isObj = length === undefined || jQuery.isFunction( object ); if ( args ) { //如果传入了参数数组,调用函数的apply方法执行该函数
if ( isObj ) {
for ( name in object ) { //对于对象,通过for-in循环遍历属性
if ( callback.apply( object[ name ], args ) === false ) { //从这里看出当each()函数传入了参数3时,参数3会传递给参数2所表示的函数
break;
}
}
} else {
for ( ; i < length; ) { //对于数组或类数组对象,则通过for 循环遍历下标
if ( callback.apply( object[ i++ ], args ) === false ) {
break;
}
}
} // A special, fast, case for the most common use of each
} else { //如果未传入参数args,则调用函数的call方法执行该方法
if ( isObj ) {
for ( name in object ) { //对于对象,通过for-in循环遍历属性名
if ( callback.call( object[ name ], name, object[ name ] ) === false ) { //从这里看出当each()函数忽略了参数3时,参数2所表示的函数的两个参数分别是index位置和当前处理的元素。
break;
}
}
} else {
for ( ; i < length; ) { //对于数组或类数组对象,则通过for 循环遍历下标
if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
break;
}
}
}
} return object;
},

就是通过for遍历,依次执行每个函数,比较简单的

对于$.fn.each()来说,它的实现代码如下:

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

参数1传递的this,也就是当前jQuery对象,jQuery对象是个类数组,因此会遍历执行在入口模块里保存的所有Dom引用,并依次执行函数

jQuery 源码分析(四) each函数 $.each和$.fn.each方法 详解的更多相关文章

  1. jQuery 源码分析(五) map函数 $.map和$.fn.map函数 详解

    $.map() 函数用于使用指定函数处理数组中的每个元素(或对象的每个属性),并将处理结果封装为新的数组返回,该函数有三个参数,如下: elems Array/Object类型 指定的需要处理的数组或 ...

  2. jQuery 源码解析(二十二) DOM操作模块 复制元素 详解

    本节说一下DOM操作模块里的复制元素子模块,该模块可以复制一个DOM节点,并且可选择的设置是否复制其数据缓存对象(包含事件信息)和是否深度复制(子孙节点等),API如下: $.clone(elem, ...

  3. Vue.js 源码分析(十九) 指令篇 v-html和v-text指令详解

    双大括号会将数据解释为普通文本,而非 HTML 代码.为了输出真正的 HTML,你需要使用 v-html 指令,例如: <!DOCTYPE html> <html lang=&quo ...

  4. Vue.js 源码分析(八) 基础篇 依赖注入 provide/inject组合详解

    先来看看官网的介绍: 简单的说,当组件的引入层次过多,我们的子孙组件想要获取祖先组件的资源,那么怎么办呢,总不能一直取父级往上吧,而且这样代码结构容易混乱.这个就是这对选项要干的事情 provide和 ...

  5. Vue.js 源码分析(七) 基础篇 侦听器 watch属性详解

    先来看看官网的介绍: 官网介绍的很好理解了,也就是监听一个数据的变化,当该数据变化时执行我们的watch方法,watch选项是一个对象,键为需要观察的数据名,值为一个表达式(函数),还可以是一个对象, ...

  6. jquery源码分析(四)——回调对象 Callbacks

    借用百度百科来说明下回调函数: 回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数.回调函数不是由该 ...

  7. jquery源码解析:attr,prop,attrHooks,propHooks详解

    我们先来看一下jQuery中有多少个方法是用来操作元素属性的. 首先,看一下实例方法: 然后,看下静态方法(工具方法): 静态方法是内部使用的,我们外面使用的很少,实例方法才是对外的. 接下来,我们来 ...

  8. jquery源码解析:proxy,access,swap,isArraylike详解

    jQuery的工具方法,其实就是静态方法,源码里面就是通过extend方法,把这些工具方法添加给jQuery构造函数的. jQuery.extend({ ...... guid: 1, //唯一标识符 ...

  9. jquery源码解析:pushStack,end,ready,eq详解

    上一篇主要讲解了jQuery原型中最重要的方法init.接下来再讲一些比较常用的原型方法和属性 core_slice = [].slice, jQuery.fn = jQuery.prototype ...

随机推荐

  1. 【前端知识体系-NodeJS相关】浅谈NodeJS中间件

    1. 中间件到底是个什么东西呢? [!NOTE] 中间件其是一个函数,在响应发送之前对请求进行一些操作 function middleware(req,res,next){ // 做该干的事 // 做 ...

  2. python 遍历一个数组

    list_test =[1,2,3,4,5] for i in range(0,len(list_test)): print(i) 结果是 1 2 3 4 5 注意 for i in range 是前 ...

  3. PHPStorm使用PHP7新特性出现红色波浪错误

    今天在项目中使用PHP7新特性时PHPStorm出现了如下红色错误,看着让人很不舒服,明明没有错 本地配置LNMP的PHP版本是7.2所以不是安装的PHP版本过低的问题,而是PHPStorm默认支持的 ...

  4. 3、Hibernate的多表关联

    一.数据库中的表关系: 一对一关系 一个人对应一张身份证,一张身份证对应一个人,一对一关系是最好理解的一种关系,在数据库建表的时候可以将人表的主键放置与身份证表里面,也可以将身份证表的主键放置于人表里 ...

  5. Maven的assembly插件在linux启动卡住Starting the localhost.localdomain

    1.今天在测试assembly的时候,在Linux虚拟机,内存配置为512mb,然后开始在Linux上运行assembly的时候就会一直卡住  2.停止运行后,查看了下日志 [root@localho ...

  6. [笔记] .net core WPF 程序,发布独立程序与单一执行程序

    如何发布独立可运行的,和只有一个文件的 .net core WPF 程序. 1 发布并打包 Step 1 在项目上右键,在菜单中选择发布,使用文件发布,选择独立部署模式,其它的条件,依照自己的情况设置 ...

  7. hive creating temporary folder on: Error encountered near token 'TOK_TMP_FILE'

    执行create tmp.tablename  as select .....语句的时候报以下错误: SemanticException 0:0 creating temporary folder o ...

  8. 教你如何用Python向手机发送通知

    ------------恢复内容开始------------ 你曾想尝试在服务器端或电脑上向手机发送通知吗? 你曾烦恼过企业邮箱的防骚扰机制吗? 现在,我们可以用一种简单轻松的方法来代替企业邮箱了! ...

  9. 官宣:腾讯WeTest明星工具-PerfDog面向全球发布!

    导读 PerfDog(官网:perfdog.qq.com)作为移动全平台性能测试分析专业工具,在腾讯内部研发测试工具商店-WeTest Store上线后服务了近2000+名开发者,其中<王者荣耀 ...

  10. Android Activity 开发常用技巧整理

    1.设置 Activity 背景色为透明 在style.xml里面声明: <style name="TranslucentActivityStyle" parent=&quo ...