欢迎访问我的github:huanshen,有我的源码解析

1、each

跟for循环很像,但是更有用,如果你理解了就知道了。

  1. // 遍历一个数组或者对象
  2. // obj 是需要遍历的数组或者对象
  3. // callback 是处理数组/对象的每个元素的回调函数,它的返回值实际会中断循环的过程
  4. // args 是额外的参数数组
  5. each: function( obj, callback, args ) {
  6. var value,
  7. i = 0,
  8. length = obj.length,
  9. isArray = isArraylike( obj );
  10.  
  11. //如果args存在的话,callback中传入的参数是grgs,each循环次数确是由obj来确定的
  12.  
  13. if ( args ) {
  14. if ( isArray ) {
  15. for ( ; i < length; i++ ) {
  16. value = callback.apply( obj[ i ], args );
  17.  
  18. if ( value === false ) {
  19. break;
  20. }
  21. }
  22. } else {
  23. for ( i in obj ) {
  24. value = callback.apply( obj[ i ], args );
  25.  
  26. if ( value === false ) {
  27. break;
  28. }
  29. }
  30. }
  31.  
  32. // A special, fast, case for the most common use of each
  33. //注意下面用的是call,上面是apply
  34. //apply 的第二个参数以数组的形式传入,但是真正运行的时候,
  35. //传入的数组参数会变成一个个的形式,而不是一个数组参数
  36. } else {
  37. if ( isArray ) {
  38. for ( ; i < length; i++ ) {
  39. value = callback.call( obj[ i ], i, obj[ i ] );
  40.  
  41. if ( value === false ) {
  42. break;
  43. }
  44. }
  45. } else {
  46. for ( i in obj ) {
  47. value = callback.call( obj[ i ], i, obj[ i ] );
  48.  
  49. if ( value === false ) {
  50. break;
  51. }
  52. }
  53. }
  54. }
  55.  
  56. return obj;
  57. },

2.makeArray

将类数组对象转化为数组。中间用到了merge函数,具体可见第三个函数,有说明。类数组对象(isArraylike)形如{0:"tt",2:"ccc",length:2};就是属性是数字形式,同时有length属性。

  1. // 将类数组对象转换为数组对象
  2. // 此方法为内部方法
  3. makeArray: function( arr, results ) {
  4. var ret = results || [];
  5.  
  6. if ( arr != null ) {
  7. // 如果 arr 是一个类数组对象,调用 merge 合到返回值
  8. if ( isArraylike( Object(arr) ) ) {
  9. jQuery.merge( ret,
  10. typeof arr === "string" ?
  11. [ arr ] : arr
  12. );
  13. } else {
  14. // 如果不是数组,则将其放到返回数组末尾
  15. // 等同于 ret.push(arr);
  16. core_push.call( ret, arr );
  17. }
  18. }
  19.  
  20. return ret;
  21. },

关于中间的Object()可以看看下面的结果(暂时不是很清楚具体的作用):

  1. var str="tttt",
  2. arr1=[1,2,3],
  3. obj={1:0},
  4. str2=Object(str);
  5. console.log( Object(str))//{0: "t", 1: "t", 2: "t", 3: "t", length: 4, [[PrimitiveValue]]: "tttt"}
  6. console.log(str2.length)//
  7. console.log(Object(arr1))//[1, 2, 3]
  8. console.log(Object(obj))//{1: 0}

3、merge 

可以合并两个数组或者类数组对象

  1. //把second中的属性添加到first中
  2. //second可以是数组或者类数组对象,又或者包含0,1属性的东西
  3. merge: function( first, second ) {
  4. var l = second.length,
  5. i = first.length,
  6. j = 0;
  7.  
  8. if ( typeof l === "number" ) {
  9. for ( ; j < l; j++ ) {
  10. first[ i++ ] = second[ j ];
  11. }
  12. } else {
  13. while ( second[j] !== undefined ) {
  14. first[ i++ ] = second[ j++ ];
  15. }
  16. }
  17.  
  18. first.length = i;
  19.  
  20. return first;
  21. },

4、map

功能跟each差不多,但是也有不一样的地方,主要是在处理第三个参数方面。

  1. map: function( elems, callback, arg ) {
  2. var value,
  3. i = 0,
  4. length = elems.length,
  5. isArray = isArraylike( elems ),
  6. ret = [];
  7.  
  8. // Go through the array, translating each of the items to their
  9. //如果是数组,isArray=true;
  10. //与each传入参数顺序是一致的
  11. if ( isArray ) {
  12. for ( ; i < length; i++ ) {
  13. value = callback( elems[ i ], i, arg );
  14.  
  15. if ( value != null ) {
  16. ret[ ret.length ] = value;
  17. }
  18. }
  19.  
  20. // Go through every key on the object,
  21. //如果是对象
  22. } else {
  23. for ( i in elems ) {
  24. value = callback( elems[ i ], i, arg );
  25.  
  26. if ( value != null ) {
  27. ret[ ret.length ] = value;
  28. }
  29. }
  30. }
  31.  
  32. // Flatten any nested arrays
  33. return core_concat.apply( [], ret );
  34. },

5、proxy

proxy(),接受一个函数,然后返回一个新函数,并且这个新函数始终保持了特定的上下文(context )语境。

  1. proxy: function( fn, context ) {
  2. var tmp, args, proxy;
  3.  
  4. if ( typeof context === "string" ) {
  5. tmp = fn[ context ];
  6. context = fn;
  7. fn = tmp;
  8. }
  9.  
  10. // Quick check to determine if target is callable, in the spec
  11. // this throws a TypeError, but we will just return undefined.
  12. if ( !jQuery.isFunction( fn ) ) {
  13. return undefined;
  14. }
  15.  
  16. // Simulated bind
  17. //如果传入的参数多余2个,把多余的参数转变为数组。
  18. args = core_slice.call( arguments, 2 );
  19. proxy = function() {
  20. //这里用到了柯里化
  21. return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
  22. };
  23.  
  24. // Set the guid of unique handler to the same of original handler, so it can be removed
  25. proxy.guid = fn.guid = fn.guid || jQuery.guid++;
  26.  
  27. return proxy;
  28. },

柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。具体可以看下面这个示例:可以看到前面两个参数并没有输出,最后一个参数和新的参数组成数组输出。在上面就是作为参数传入proxy中

  1. function t (l,t,y){
  2. var args = [].slice.call( arguments, 2 );
  3. console.log(args)
  4. function t(){
  5. console.log(args.concat([].slice.call( arguments )));
  6. }
  7. return t;
  8. }
  9. var tt=t(1,2,3);
  10. tt("t");//[3,"t"]

jQuery中的函数汇总1的更多相关文章

  1. 解读jQuery中extend函数

    $.extend.apply( null, [ true, { "a" : 1, "b" : 2 } ] );//console.log(window.a); ...

  2. OpenCV图像处理中常用函数汇总(1)

    //俗话说:好记性不如烂笔头 //用到opencv 中的函数时往往会一时记不起这个函数的具体参数怎么设置,故在此将常用函数做一汇总: Mat srcImage = imread("C:/Us ...

  3. jQuery中jsonp函数实现

    由于浏览器中的同源策略,不同的域名,不同的协议,甚至不同的端口都无法请求数据.因此出现了浏览器跨域请求数据问题. Jsonp是解决跨域问题的一个非常流行的方法. JSONP(JSON with Pad ...

  4. jQuery中live函数的替代-【jQuery】

    在老版本的jQuery中,当需要对页面上某个由ajax加载的某片段的页面内容响应事件时,可以使用live函数来响应其事件,比如: $('a').live('click', function() { b ...

  5. jQuery中attr()函数 VS prop()函数

    http://www.365mini.com/page/jquery-attr-vs-prop.htm 在jQuery中,attr()函数和prop()函数都用于设置或获取指定的属性,它们的参数和用法 ...

  6. jquery中ready函数,$(function(){})与自执行函数的区别

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. 关于jQuery中toggle()函数的使用

    今天遇到一个有趣的例子,将它记录下来. 一个一级菜单,里边有一个二级菜单,二级菜单是通过锚点来链接页面元素的.想要实现的效果是当点击锚点时,页面链接到相应锚点,同时二级菜单隐藏,再点击一级菜单时,继续 ...

  8. thinkphp中的内置操作数据库与mysql中的函数汇总

    8.4.4 Model类getModelName() 获取当前Model的名称getTableName() 获取当前Model的数据表名称switchModel(type,vars=array()) ...

  9. javascript中常用函数汇总

    js中函数很多,在实际项目开发中,函数的应用可以很大程度上简化我们的代码,所以在此记下开发中js中常用的函数,增强记忆. 1.isNaN(X):函数用于检查其参数是否是非数字值. 如果 x 是特殊的非 ...

随机推荐

  1. ACE Editor在线代码编辑器简介及使用引导

    转自博客:https://www.cnblogs.com/cz-xjw/p/6476179.html ACE 是一个开源的.独立的.基于浏览器的代码编辑器,可以嵌入到任何web页面或JavaScrip ...

  2. java基础知识-比较运算符

    演示比较运算符 == : 判断两个值是否相等 != : 判断两个数是否不相等(不能写成<>) > :判断左边值是否大于右边值 < :判断左边值是否小于右边值 >= : 判 ...

  3. Anroid 手机助手 详细解析 概述(二)

    这篇主要说一下手机插入之后的一些动作. 1)  捕获窗口消息 插入拔出一个USB设备windows 会给所有的窗口发送特定的消息,只要我们捕获这些消息就可以处理设备插入和拔出.需要注意的是插入或者拔出 ...

  4. ASP.NET Web API 框架研究 Controller创建 HttpController介绍

    对请求进行路由解析以及消息处理管道进行处理后,最后可以从HttpRequestMessage对象的属性字典中获取解析的路由数据,后边我们就可以根据其进行HttpController的创建,从前边几篇可 ...

  5. socket粗解

    百度定义:网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket通信流程: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一 ...

  6. 检查.net dll构建的目标平台是any cpu、x86、x64

    有时候,需要检查构建的dll是否针对正确的平台 可以使用CorFlags.exe(它是.NET Framework SDK的一部分)从dll中查找此信息.运行CorFlags.exe将产生以下输出: ...

  7. 【C#】转一篇MSDN杂志文:ASP.NET Pipeline: Use Threads and Build Asynchronous Handlers in Your Server-Side Web Code

    序:这是一篇发表在2003年6月刊的MSDN Magazine的文章,现在已经不能在线阅读,只提供chm下载.讲的是异步请求处理那些事,正是我上一篇博文涉及的东西(BTW,事实上这篇杂志阐述了那么搞然 ...

  8. WPF MeasureOverride和 ArrangeOverride做个 页面导航

    public class NavigationPanel:Panel { protected override Size MeasureOverride(Size availableSize) { S ...

  9. .net mvc 站点自带简易SSL加密传输

    因项目需要,传输数据需要加密,因此有了一些经验,现简易抽出来分享! 请求:前端cryptojs用rsa/aes 或 rsa/des加密,后端.net 解密返回后端.net用rsa/aes 或 rsa/ ...

  10. c++中的一些计算的问题

    要实现小数的四舍五入, float a = 3.456; //保留到小数点后两位 float b =(int)((a * 100) + 0.5) / 100.0; 但是这样对负数不好使, 对负数的话, ...