经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » jQuery » 查看文章
jQuery 源码分析(四) each函数 $.each和$.fn.each方法 详解
来源:cnblogs  作者:大沙漠  时间:2019/8/28 8:51:48  对本文有异议

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

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

  object   待遍历的对象或数组

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

 writer by:大沙漠 QQ:22969969

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

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

例如:

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

输出如下:

 

 源码分析


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

  1. // args is for internal usage only
  2. each: function( object, callback, args ) { //通用的遍历迭代方法,用于无缝地遍历对象和数组。object是待遍历的对象或数组 args是传给回调函数callback的参数数组
  3. var name, i = 0,
  4. length = object.length,
  5. isObj = length === undefined || jQuery.isFunction( object );
  6. if ( args ) { //如果传入了参数数组,调用函数的apply方法执行该函数
  7. if ( isObj ) {
  8. for ( name in object ) { //对于对象,通过for-in循环遍历属性
  9. if ( callback.apply( object[ name ], args ) === false ) { //从这里看出当each()函数传入了参数3时,参数3会传递给参数2所表示的函数
  10. break;
  11. }
  12. }
  13. } else {
  14. for ( ; i < length; ) { //对于数组或类数组对象,则通过for 循环遍历下标
  15. if ( callback.apply( object[ i++ ], args ) === false ) {
  16. break;
  17. }
  18. }
  19. }
  20. // A special, fast, case for the most common use of each
  21. } else { //如果未传入参数args,则调用函数的call方法执行该方法
  22. if ( isObj ) {
  23. for ( name in object ) { //对于对象,通过for-in循环遍历属性名
  24. if ( callback.call( object[ name ], name, object[ name ] ) === false ) { //从这里看出当each()函数忽略了参数3时,参数2所表示的函数的两个参数分别是index位置和当前处理的元素。
  25. break;
  26. }
  27. }
  28. } else {
  29. for ( ; i < length; ) { //对于数组或类数组对象,则通过for 循环遍历下标
  30. if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
  31. break;
  32. }
  33. }
  34. }
  35. }
  36. return object;
  37. },

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

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

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

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

原文链接:http://www.cnblogs.com/greatdesert/p/11399282.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号