关于jQuery中的each方法(jQuery到底干了什么)


Posted in Javascript onMarch 05, 2014

1. 估计很多人都会用到jQuery中的each方法。

那就来看一看jQuery都干了些什么。

找到jquery中的each源码:

each: function( object, callback, args ) { 
var name, i = 0, 
length = object.length, 
isObj = length === undefined || jQuery.isFunction( object ); if ( args ) { 
if ( isObj ) { 
for ( name in object ) { 
if ( callback.apply( object[ name ], args ) === false ) { 
break; 
} 
} 
} else { 
for ( ; i < length; ) { 
if ( callback.apply( object[ i++ ], args ) === false ) { 
break; 
} 
} 
} 
// A special, fast, case for the most common use of each 
} else { 
if ( isObj ) { 
for ( name in object ) { 
if ( callback.call( object[ name ], name, object[ name ] ) === false ) { 
break; 
} 
} 
} else { 
for ( ; i < length; ) { 
if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { 
break; 
} 
} 
} 
} 
return object; 
},

这段代码还是比较简单的,应该没什么问题.

为了测试这个东西,我写了下面一段js;

$.each($(".demo"),function(){ 
console.log("show"); 
});

然后再加一段html:
<a href="" class="demo"></a> 
<a href="" class="demo"></a> 
<a href="" class="demo"></a>

然后拿着jQuery的源码来调试,以为能得到正确的结果。可是很遗憾。
关于jQuery中的each方法(jQuery到底干了什么) 
可以看到,这里的object竟然不是我所想要的那三个html对象,竟然是js内置的8种数据类型。

之后在jquery的源码中加了一段代码:

console.log(Object.prototype.toString(object)); 
console.log(length);

之后的输入如下:
关于jQuery中的each方法(jQuery到底干了什么) 
也就是说在文档加载的时候,jQuery会用each遍历dom对象,即使没有使用
$(function(){ 
});

当遍历指定对象之后,依旧会继续冒泡遍历父级元素。

2. 根据jQuery的源码使用回调函数参数

$.each($(".demo"),function(a,b){ 
console.log(a + "" + $(a).attr("class")); 
})

从源码可以看到:
callback.call( object[ i ], i, object[ i++ ] )

最后都将当前对象通过call方法传递给了回调函数,那么就可以像上面一样去使用当前对象中的属性。当然也可以直接用this来调用。

如果说复杂些的东西,比如,这里我是将$(".demo")作为object传递进去给$.each()

如里某些时候不是传递的jQuery或者html对象。而是一个Object或者array。

而在array中又存在很多其它的object或者方法。

这样就能弄出更多的效果。

3. 采用call或者apply实现回调模式.

从上面的代码可以看到:

callback.call(obj,args)

callback.apply([obj],args)

之类的代码,这里只需要传递callback函数,就能实现自己调用,这对于提高代码的复用程度用处不小。

但是也存在某些缺点,比如代码可读性降低,耦合程度增加等。

偶有所得,以记录之,以防忘记!

Javascript 相关文章推荐
理解JavaScript变量作用域更轻松
Oct 25 Javascript
分享一个自己写的table表格排序js插件(高效简洁)
Oct 29 Javascript
jquery实现弹出div,始终显示在屏幕正中间的简单实例
Mar 08 Javascript
JS动态插入并立即执行回调函数的方法
Apr 21 Javascript
gulp-uglify 与gulp.watch()配合使用时报错(重复压缩问题)
Aug 24 Javascript
JS给Array添加是否包含字符串的简单方法
Oct 29 Javascript
JavaScript中transform实现数字翻页效果
Mar 08 Javascript
WebSocket实现简单客服聊天系统
May 12 Javascript
基于webpack-hot-middleware热加载相关错误的解决方法
Feb 22 Javascript
JS数组方法concat()用法实例分析
Jan 18 Javascript
JavaScript面向对象核心知识与概念归纳整理
May 09 Javascript
javascript实现拼图游戏
Jan 29 Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
Mar 05 #Javascript
js时间比较示例分享(日期比较)
Mar 05 #Javascript
对于Form表单reset方法的新认识
Mar 05 #Javascript
js和css写一个可以自动隐藏的悬浮框
Mar 05 #Javascript
7个JS基础知识总结
Mar 05 #Javascript
100个不能错过的实用JS自定义函数
Mar 05 #Javascript
jQuery DOM操作实例
Mar 05 #Javascript
You might like
php 短链接算法收集与分析
2011/12/30 PHP
PHP的Yii框架中创建视图和渲染视图的方法详解
2016/03/29 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
2019/08/27 PHP
PHP实现文件上传后台处理脚本
2020/03/04 PHP
javascript实现动态增加删除表格行(兼容IE/FF)
2007/04/02 Javascript
JQuery实现自定义对话框的代码
2008/06/15 Javascript
Javascript 判断函数类型完美解决方案
2009/09/02 Javascript
jQuery 核心函数以及jQuery对象
2010/03/23 Javascript
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
Js注册协议倒计时的小例子
2013/06/24 Javascript
sails框架的学习指南
2014/12/22 Javascript
浅谈Jquery核心函数
2015/06/18 Javascript
jQuery原理系列-常用Dom操作详解
2016/06/07 Javascript
详解jQuery lazyload 懒加载
2016/12/19 Javascript
Javascript下拉刷新的简单实现
2017/02/14 Javascript
微信小程序 自动登陆PHP源码实例(源码下载)
2017/05/08 Javascript
js如何编写简单的ajax方法库
2017/08/02 Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
利用angular自动编译andriod APK的绕坑经历分享
2019/03/08 Javascript
基于vue实现滚动条滚动到指定位置对应位置数字进行tween特效
2019/04/18 Javascript
React Native中ScrollView组件轮播图与ListView渲染列表组件用法实例分析
2020/01/06 Javascript
nodejs各种姿势断点调试的方法
2020/06/18 NodeJs
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
[00:36]DOTA2上海特级锦标赛 Archon战队宣传片
2016/03/04 DOTA
python脚本实现分析dns日志并对受访域名排行
2014/09/18 Python
Python实现简单HTML表格解析的方法
2015/06/15 Python
Python的numpy库中将矩阵转换为列表等函数的方法
2018/04/04 Python
解决Django中调用keras的模型出现的问题
2019/08/07 Python
python map比for循环快在哪
2020/09/21 Python
python切片作为占位符使用实例讲解
2021/02/17 Python
html5 canvas-1.canvas介绍(hello canvas)
2013/01/07 HTML / CSS
应用服务器有那些
2012/01/19 面试题
青春演讲稿范文
2014/05/08 职场文书
党的群众教育实践活动实施方案
2014/06/12 职场文书
小学生差生评语
2014/12/29 职场文书