each jquery 模板 jquery each()_each jquery 模板

阅读本文约需要5分钟

大家好,我是你们的导师,我每天都会给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈)。上次给大家分享了在数组中查找指定元素,今天跟大家分享下jQuery通用遍历方法each的实现。

1. each介绍

jQuery 的 each 方法,作为一个通用遍历方法,可用于遍历对象和数组。语法为:jQuery.each(object, [callback])。

回调函数拥有两个参数:第一个为对象的成员或数组的索引,第二个为对应变量或内容。

each jquery 模板 jquery each()_回调函数_02

2. 退出循环

尽管 ES5 提供了 forEach 方法,但是 forEach 没有办法中止或者跳出 forEach 循环,除了抛出一个异常。但是对于 jQuery 的 each 函数,如果需要退出 each 循环可使回调函数返回 false,其它返回值将被忽略。

each jquery 模板 jquery each()_each jquery 模板_03

3. 第一版

那么我们该怎么实现这样一个 each 方法呢?首先,我们肯定要根据参数的类型进行判断,如果是数组,就调用 for 循环,如果是对象,就使用 for in 循环,有一个例外是类数组对象,对于类数组对象,我们依然可以使用 for 循环。

each jquery 模板 jquery each()_jQuery_04

现在已经可以遍历对象和数组了,但是依然有一个效果没有实现,就是中止循环,按照 jQuery each 的实现,当回调函数返回 false 的时候,我们就中止循环。这个实现起来也很简单:

我们只用把:callback(i, obj[i]) 替换成:

each jquery 模板 jquery each()_jQuery_05

我们在实际的开发中,我们有时会在 callback 函数中用到 this,先举个不怎么恰当的例子:

each jquery 模板 jquery each()_回调函数_06

这个时候,我们就希望 this 能指向当前遍历的元素,然后给每个元素添加 age 属性。指定 this,我们可以使用 call 或者 apply,其实也很简单。我们把:

each jquery 模板 jquery each()_控制for each循环次数_07

替换成:

each jquery 模板 jquery each()_each jquery 模板_08

回到第一种写法上,就是因为将 this 指向了当前 DOM 元素,我们才能使用 $(this)将当前 DOM 元素包装成 jQuery 对象,优雅的使用 hover 方法。所以最终的 each 源码为:

each jquery 模板 jquery each()_回调函数_09