问题1:jQuery.grep源码是什么?

//grep函数,第三个参数表示是否根据fn的结果取反!
grep: function( elems, callback, invert ) {
var callbackInverse,
matches = [],
i = 0,
//保存数组个数
length = elems.length,
//对传入的第二个参数取反,true变成false,false变成true
//如果invert为false,即!inverse为true,那么直接把函数返回true的元素加入,所以期望callbackExpect的就是true
callbackExpect = !invert;
// Go through the array, only saving the items
// that pass the validator function
for ( ; i < length; i++ ) {
//如果invert是false,表示不取反,那么如果fn返回true,就直接加入进去matches数组
//获取回调函数结果的返回值的取反的结果
callbackInverse = !callback( elems[ i ], i );
if ( callbackInverse !== callbackExpect ) {
matches.push( elems[ i ] );
}
}
return matches;
}

问题2:jQuery.grep调用方式有那些?

在winnow函数中

   if ( qualifier.nodeType ) {return jQuery.grep( elements, function( elem ) {//没有第三个参数,表示获取执行函数后返回为true元素在结果数组中return ( elem === qualifier ) !== not;});}

在winnow函数中还有调用

return jQuery.grep( elements, function( elem ) {return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not;<span style="font-family: Arial, Helvetica, sans-serif;">//没有第三个参数,表示获取执行函数后返回为true元素在结果数组中</span>});

还是在winnow方法中

 return jQuery.grep( elements, function( elem, i ) {/* jshint -W018 */return !!qualifier.call( elem, i, elem ) !== not;<span style="font-family: Arial, Helvetica, sans-serif;">//没有第三个参数,表示获取执行函数后返回为true元素在结果数组中</span>});

在jQuery.buildFragment中调用

       jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );

该方法用于将所有的input元素的defaultChecked属性设置为和checked一样

// Used in buildFragment, fixes the defaultChecked property
var rcheckableType = (/^(?:checkbox|radio)$/i);
function fixDefaultChecked( elem ) {if ( rcheckableType.test( elem.type ) ) {elem.defaultChecked = elem.checked;//这里没有明确返回真或者假,所以他只是用来修改元素,而不再保存修改后的数组!}
}

问题3:jQuery.grep方法的作用是什么?

如果没有传入第三个参数的情况下,表示我们希望返回调用回调函数后结果为true的元素,所以jQuery.grep的作用就在于筛选了,只有满足特定条件的元素才会出现在结果数组中!记住:该函数的返回值是数组哦!
我们通过下面例子来分析如何选择id和class都是father的元素

 <div class="father" id="father" style="background-color:red;height:400px;background-color:#ccc;">
</div>  <div class="father" style="background-color:red;height:400px;background-color:#ccc;">
</div>

JS部分

     //对每一个元素进行筛选,只有符合条件的元素才会在结果数组中!var result=jQuery.grep($(".father"),function(elem,index){return elem.id==="father";//grep通过false,true来判断是否在结果集合中;map通过明确的return elem//而each通过false,true决定是否退出循环});console.log(result);//打印[div#father.father]

所以grep是通过返回值的真假来决定返回的元素的,所有满足条件的元素构成一个DOM集合!
HTML部分不变,我们把JS部分修改为:

     //对每一个元素进行筛选,只有符合条件的元素才会在结果数组中!var result=jQuery.grep($(".father"),function(elem,index){return elem.id==="father";//grep通过false,true来判断是否在结果集合中;map通过明确的return elem//而each通过false,true决定是否退出循环},true);console.log(result);//[div.father]

这时候因为第三个参数是true,因为在内部会取反,所以表示我们希望值是false的元素出现在结果数组中,所以结果数组中只包含第二个div元素。

其实源码中的代码可以修改为:

//下面的代码可以修改为:callbackResult = callback( elems[ i ], i );//调用函数的结果
if ( callbackResult === callbackExpect ) {//如果调用的结果和期望的结果一样,那么直接放进结果数组返回
matches.push( elems[ i ] );
}

问题4:在jQuery.grep中上下文和参数是什么?

解答:因为没有明确调用call或者apply,所以上下文由运行环境决定。第一个参数是元素,第二个参数是下标(只有jQuery.each,和实例each,map方法第一个参数是下标,第二个参数是元素!)

总结:

(1)$.each方法强调的是遍历,也就是遍历出所有的元素然后执行一个回调函数,如果return false那么就停止后面的调用;grep强调的是按照一个函数对所有的元素进行筛选,让所有元素执行一个函数看看返回值是否满足期望的返回值,如果满足就可以在结果数组中,第三个参数表示是否取反,所以grep强调筛选;map强调的是修改,也就是对所有的元素集合进行修改.(map强调修改,grep强调筛选,each强调遍历)

(2)each的回调函数传入的参数是下标和元素,下标在前元素在后,其它grep或者map方法传入的参数是元素和下标,元素在前下标在后(实例map,each方法除外)!

jQuery源码分析之$.grep()函数四问相关推荐

  1. jQuery源码分析之$.inArray()函数

    测试代码1: //indexOf原生方法:indexOf(特定的元素,开始下标); //同时indexOf的第二个参数可以是负数,表示从倒数第几个开始,记住,此时不是看下标,而是看倒数第几个! var ...

  2. Jquery源码分析之匿名函数的自执行

    匿名函数的格式: 格式: (function(){ //代码 })(); //和这个基于jQuery的比较下: $(function(){alert("this is a test" ...

  3. jQuery源码分析-each函数

    本文部分截取自且行且思 jQuery.each方法用于遍历一个数组或对象,并对当前遍历的元素进行处理,在jQuery使用的频率非常大,下面就这个函数做了详细讲解: 复制代码代码 /*! * jQuer ...

  4. jQuery源码分析系列

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...

  5. [转]jQuery源码分析系列

    文章转自:jQuery源码分析系列-Aaron 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAaro ...

  6. [转] jQuery源码分析-如何做jQuery源码分析

    jQuery源码分析系列(持续更新) jQuery的源码有些晦涩难懂,本文分享一些我看源码的方法,每一个模块我基本按照这样的顺序去学习. 当我读到难度的书或者源码时,会和<如何阅读一本书> ...

  7. jQuery源码分析系列:.domManip() .buildFragment() .clean()

      .domManip(args,table,callback):是jQuery DOM操作的核心函数,可以扩展出如下方法: append/appendTo: prepend/prependTo: b ...

  8. jQuery源码分析系列:属性操作

    属性操作 1.6.1相对1.5.x最大的改进,莫过于对属性.attr()的重写了.在1.6.1中,将.attr()一分为二: .attr()..prop(),这是一个令人困惑的变更,也是一个破坏性的升 ...

  9. jQuery 源码分析第一篇之入口源码

    目前阅读的是jQuery 1.11.3的源码,有参考nuysoft的资料.原来比较喜欢在自己的Evernote上做学习基类,并没有在网上写技术博客的习惯,现在开始学习JS的开源代码,想跟大家多交流,希 ...

最新文章

  1. 第2关:利用栈判断字符串括号是否匹配
  2. ASP.NET CORE系列【一】搭建ASP.NET CORE项目
  3. MapReduce中的partitioner
  4. Spring Boot中如何干掉过多的if else!
  5. android图库文件夹乱,防止文件夹包含在Android图库中 | MOS86
  6. 服务器网盘系统怎么装,云服务器上怎么安装操作系统
  7. 2020快手食品行业数据价值报告
  8. python—15种字符串操作
  9. 谷歌修复多个严重的安卓 RCE 漏洞
  10. Fedora上配置一个安全FTP
  11. Latch free等待事件
  12. 视觉十四讲 第三讲 深蓝学院习题分析
  13. HTTPS证书基本概述
  14. Python数据分析-绘图-3-Bokeh交互式绘图-1-基本构成与语法
  15. 基于Matlab软件的视觉导航系统的仿真
  16. html怎么电视连电脑,电脑怎么投屏到电视?图文讲解电脑投屏具体方法步骤
  17. 高新技术企业认定,知识产权核查篇
  18. 2014第7周日最强大脑
  19. 51单片机复位按钮不灵敏的问题
  20. Windows Azure Platform (九) Windows Azure Storage Service存储服务

热门文章

  1. 读取数据 python
  2. BAT命令常用API
  3. 无人机拉力测试台螺旋桨的正确安装方式
  4. C语言中sizeof测量形参中数组的长度
  5. 我的LinkedIn领英之路,如何高效开发外贸客户
  6. 高精度运算模板(高精度加减乘除)
  7. 人机交互技术课程实验报告《外卖管理》系统Web界面分析报告
  8. c语言程序设计文件操作题库,C语言程序设计文件操作.doc
  9. 百度重要技术精英出走! 云计算和大数据首席架构师林仕鼎辞职!
  10. iOS闪退:Cannot form weak reference to instance (xxx) of class