在看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方法的更多相关文章

  1. jquery 中一些 特殊方法 的特殊使用 一览表

    cnblogs的页面, 一种是管理页面, 是随笔的列表 a full list of essays. 另一种是 首页. 要搜索文档的话, 就使用 "首页"的那种方式. 一个jque ...

  2. 解决关于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 ...

  3. jQuery中的join方法

    和JS 中的JOIN 方法一样,将一数组按照JOIN的参数连接起来.比如: var arr = [ "a", "b", "c", " ...

  4. jquery中的index方法

    问题描述:灵活使用jquery中的index方法 方法签名:index([selector|element]) 用法概述:P1.index(P2)  //调用者P1可以为对象或集合 参数为空,返回P1 ...

  5. 用JQuery中的Ajax方法获取web service等后台程序中的方法

    用JQuery中的Ajax方法获取web service等后台程序中的方法 1.准备需要被前台html页面调用的web Service,这里我们就用ws来代替了,代码如下: using System; ...

  6. jQuery中的ready方法及实现按需加载css,js

    模拟jQuery中的ready方法及实现按需加载css,js 一.ready函数的实现 经常用jQuery类库或其他类库中的ready方法,有时候想想它们到底是怎么实现的,但是看了一下jQuery中的 ...

  7. $.ajax()方法详解 jquery中的ajax方法

    jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(p ...

  8. jQuery中的$.ajax()方法

    jQuery中的$.ajax()方法 $.ajax({ type:"POST", url:"../page/user.action?userId=" + use ...

  9. jquery中的ajax方法参数

    引用来自:http://www.cnblogs.com/tylerdonet/p/3520862.html jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String ...

随机推荐

  1. 如何将 select top 4 id from table1 赋值 给 declare @id1 int,@id2 int,@id3 int,@id4 int

    declare @id1 int,@id2 int,@id3 int,@id4 int ),) select @sickcode = sickcode,@sfrq =sfrq from tablena ...

  2. C# winform 选择项 省市连动

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. Web前端设计:Html强制不换行<nobr>标签用法代码示例

    在网页排版布局中比如文章列表标题排版,无论多少文字均不希望换行显示,需要强制在一行显示完内容.这就可以nobr标签来实现.它起到的作用与word-break:keep-all 是一样的.nobr 是 ...

  4. String str 与 String str=new String("") 区别

    1.当使用String str="abc",这种方式时,先去内存的Heap中找是否存在"abc"这个字符串,若存在,则将地址引用.若不存在则创建. 2.当使用S ...

  5. sass最佳实践

    sass 变量 可以实现统一的布局,比如统一的内边距,统一的外边距,统一的颜色,统一的字号. 嵌套 可以根据组件的嵌套方式来嵌套css代码,方便收缩,查找.代码结构非常清晰,有利于以组件的方式开发 混 ...

  6. salvage 数据块打捞工具

    基本上所有数据库都是按块存储数据的,每种数据库的块都有自己有特征,我们可以找出特征,当数据库文件丢失,甚至文件系统完全损坏时,从硬盘扇区中把数据页打捞出来,从页从数据页中恢复出行数据.根据这个原理,开 ...

  7. 随机森林之Bagging法

    摘要:在随机森林介绍中提到了Bagging方法,这里就具体的学习下bagging方法. Bagging方法是一个统计重采样的技术,它的基础是Bootstrap.基本思想是:利用Bootstrap方法重 ...

  8. SAP校园招聘笔试

    一直就向往着SAP公司,终于,有幸今天参加了SAP校园招聘的笔试.下面我就来简单说说这个笔试的内容. 笔试分为两大部分,一部分是逻辑题,就是些什么阅读分析计算balabala的一堆,是全英文的.另外一 ...

  9. Call与Apply

    1.前言 ECMAscript中提供了两个方法(call,apply)用于改变对象内部的this指针,它们两个的作用都是一样的,但是传递的参数有点不大相同. 它们的大概语法为: call(this, ...

  10. 《Spring3.0就这么简单》

    第一章 认识Spring 1.Spring提供的IOC容器,是Spring大杀器之一.容器将对象之间的依赖关系交给Spring进行控制,采用配制的方式对依赖关系进行描述,由Ioc容器负责依赖类之间的创 ...