分析jQuery中的each方法
在看jQuery源码是怎么实现each方法之前,我们看一下js的原生实现。
ECMAScript 5为数组定义了一个forEach方法,该方法接受两个参数:第一个参数是要在每一个数组项上运行的函数,第二个参数是运行该函数的作用域对象。第二个参数为非必填。作为第一个参数的运行函数接受三个参数,分别是:数组项的值、该项在数组中的位置、数组本身。示例代码如下:
var aa = [1,2,3]
aa.forEach(function(item, index, array){
console.log("item:"+item)
console.log("index:"+index)
console.log(array)
})
原生的方法,效率应该没问题。但是我们仔细一想,这个原生方法可能不太适合用在我们的实际开发中。因为实际开发中我们经常会遇到满足某个条件跳出循环的情况。不能够break,这是原生方法的硬伤。怎么办?我们结合ECMAScript 5的定义自己写一个试试,并且让它也适应于对象。我写的大体代码如下:
function forEach( object, callback, context ) {
if ( typeof object.length ==="number" ){
for ( var name in object ) {
if (object.hasOwnProperty(name) && false === callback.call( context, object[name], name, object ) ) break;
}
} else {
for ( var i = 0, len = object.length; i < len; i++ ) {
if (false === callback.call( context, object[i], i, object ) ) break;
}
}
}
函数的第一个参数是要循环的数组或对象,第二个参数是每项要执行的函数,第三项为非必填,为函数运行的作用域对象。这里主要的变化就是当运行函数返回false时,即跳出循环。
还有就是在循环对象的时候加了一个object.hasOwnProperty的判断,以保证是实例中的属性而不是原型中的。
现在我们再看下jQuery对each方法的实现,比较一下和我们写的有什么不同。代码如下:
each: function( obj, callback, args ) {
var value,
i = 0,
length = obj.length,
isArray = isArraylike( obj ); if ( args ) {
if ( isArray ) {
for ( ; i < length; i++ ) {
value = callback.apply( obj[ i ], args ); if ( value === false ) {
break;
}
}
} else {
for ( i in obj ) {
value = callback.apply( obj[ i ], args ); if ( value === false ) {
break;
}
}
}
} else {
if ( isArray ) {
for ( ; i < length; i++ ) {
value = callback.call( obj[ i ], i, obj[ i ] ); if ( value === false ) {
break;
}
}
} else {
for ( i in obj ) {
value = callback.call( obj[ i ], i, obj[ i ] ); if ( value === false ) {
break;
}
}
}
} return obj;
}
我们看到jQuery实现的each方法的第一个参数也是要循环的数组或对象,第二个参数也是每项要执行的函数。不同的是:
a、这里的第三个参数并不是运行该函数的作用域对象。从代码中看这里的args,是传给运行函数的参数。这种用法不常用,调用时一般用不到args。
b、循环数组或对象的每一项的值作为了运行函数的作用域对象,即运行函数里的this指向了obj[i]。
c、运行函数参数的顺序有所不同,变成了先是”该项在数组中的位置“,再是”项的值“了。我觉得还是先有value 再有 index(或key)会好一些。
d、在循环对象时没有进行hasOwnProperty的判断,这个到底有没有必要那?请高手指点一下!3Q。
e、还有就是jQuery最后返回了要循环的对象。
分析jQuery中的each方法的更多相关文章
- jquery 中一些 特殊方法 的特殊使用 一览表
cnblogs的页面, 一种是管理页面, 是随笔的列表 a full list of essays. 另一种是 首页. 要搜索文档的话, 就使用 "首页"的那种方式. 一个jque ...
- 解决关于jquery中$.get()方法总是报“HierarchyRequestError: Node cannot be inserted at the specified point in the hierarchy”错的方法
解决关于jquery中$.get()方法总是报“HierarchyRequestError: Node cannot be inserted at the specified point in the ...
- jQuery中的join方法
和JS 中的JOIN 方法一样,将一数组按照JOIN的参数连接起来.比如: var arr = [ "a", "b", "c", " ...
- jquery中的index方法
问题描述:灵活使用jquery中的index方法 方法签名:index([selector|element]) 用法概述:P1.index(P2) //调用者P1可以为对象或集合 参数为空,返回P1 ...
- 用JQuery中的Ajax方法获取web service等后台程序中的方法
用JQuery中的Ajax方法获取web service等后台程序中的方法 1.准备需要被前台html页面调用的web Service,这里我们就用ws来代替了,代码如下: using System; ...
- jQuery中的ready方法及实现按需加载css,js
模拟jQuery中的ready方法及实现按需加载css,js 一.ready函数的实现 经常用jQuery类库或其他类库中的ready方法,有时候想想它们到底是怎么实现的,但是看了一下jQuery中的 ...
- $.ajax()方法详解 jquery中的ajax方法
jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(p ...
- jQuery中的$.ajax()方法
jQuery中的$.ajax()方法 $.ajax({ type:"POST", url:"../page/user.action?userId=" + use ...
- jquery中的ajax方法参数
引用来自:http://www.cnblogs.com/tylerdonet/p/3520862.html jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String ...
随机推荐
- [盈利指导] [原创]五蕴皆空:App推广干货,排名数据分析优化效果
App盈利交流论坛版主第一帖2015年3月份,在百度上了一款赛车类游戏(不说什么名字了怕被打包),后台起名叫002,刚开始上的时候一天只有几元钱,但是游戏还是倾注了不少心血的,觉得不甘心, ...
- Linux命令(1):cd命令
1.作用:改变工作目录: 2.格式:cd [路径] 其中的路径为要改变的工作目录,可为相对路径或绝对路径 3.使用实例:[root@www uclinux]# cd /home/yourname/ ...
- iOS打包及发布
本篇介绍iOS应用的发布流程:由于苹果的发布周期太长, 再介绍一个很好用的测试网站——蒲公英. iOS应用程序的发布和真机调试调试很像,也需要申请各类证书. 1.进入https://developer ...
- Objective-c中的对象间的消息传递以及消息路由
刚开始使用Objective-C时,总是习惯将对象间发送消息之间称呼为方法调用.心想,这和c#不是一回事吗?不就是调用实例方法吗,还搞个消息发送作甚,最后还不是要转化为方法的调用?通过一段时间的理解学 ...
- 【转载】应广大群众的要求,今天开始连载《超容易的Linux系统管理入门书》一书
学习Linux容易嘛?我说超容易,你肯定不信.那学习Linux最好的学习方法是什么,就是脑子里面一直提问题,不停的提,时时刻刻提,如果你没有问题,那再容易的学习书你也看不懂. <超容易的Linu ...
- linux同步
1. 内核同步 主要是防止多核处理器同时访问修改某段代码,或者在对设备驱动程序进行临界区的保护. 1 .互斥量 头文件 #include<linux/mutex.h> 初始化方法: 静态初 ...
- Linux设备总线
kobject和kset是Linux设备模型中最基本的元素,其中,kset是同种类型kobject对象的集合.每个在内核中注册的kobject对象都对于sysfs文件系统中的一个目录.下面是自己花的一 ...
- Poj 3239 Solution to the n Queens Puzzle
1.Link: http://poj.org/problem?id=3239 2.Content: Solution to the n Queens Puzzle Time Limit: 1000MS ...
- 配置ADB 工具 (Win7_64)
ADB (Android Debut Bridge) ADB这个工具, 让我们可以用电脑来操纵手机 Android studio 安装好之后在SDK 中就有ADB 但是我们想使用它还需要配置它的环境变 ...
- Java执行命令行脚本
百度到的 Process p=Runtime.getRuntime().exec("C:\\test.cmd"); ProcessBuilder processBuilder=ne ...