jq代码分析-函数

extend

 

第 一个参数可以对象  也可以是布尔    (如果是布尔值表示是否深度便利)

如果是一个对象则 扩展到原来的对象上去

如果是多个对象   则每个对象都扩展到原来的对象上去

 

var wt = function(){

};

wt.extend = function() {

                   var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;

                  

                   //根据第一个参数来判断是否深度遍历

                   if ( typeof target === "boolean" ) {

                            deep = target;

                            target = arguments[1] || {};

                            i = 2;         

                   }

                   

 

                   if ( typeof target !== "object" )

                            target = {};

        

        

                   //如果只有一个遍历对象  (在有判断深度遍历的时候 i=2了 这时是2个以上参数 遍历对象从地2个开始)        

                   // 用 target引用wt

                   if ( length == i ) {

                            target = this;

                            --i;

                   }

        

 

                   for ( ; i < length; i++ )

 

                            if ( (options = arguments[ i ]) != null )

 

                                     for ( var name in options ) {

                                               var src = target[ name ], copy = options[ name ];

        

                                               if ( target === copy )

                                                        continue;

                                               //如果他们引用的同一个对象 跳出循环 避免重复遍历

 

                                               if ( deep && copy && typeof copy === "object" && !copy.nodeType )

                                                        target[ name ] = wt.extend( deep,

 

                                                                 src || ( copy.length != null ? [ ] : { } )

                                                        , copy );

                                               //进行深度遍历     

 

                                               else if ( copy !== undefined )

                                                        target[ name ] = copy;

                                     }

 

                  return target;

};

 

each

 

有3个参数 第一个是集合 可以是数组,对象,元素集合(如document.body.getElementsByTagName('div'))  
第2个参数是函数 就是每次便利的时候需要执行的函数
如果不带第3个参数arg 
且如果第一个参数是obj callbacl的第一个参数是  属性名  第二个是属性直
如果第一个参数是 数组or元素集合 则第一个参数某项的索引 第2个参数是直
第3个参数 是指callback的所需要的参数 可以为空 且必须为数组
 

  1.         function each( object, callback, args ) {  
  2.             var name, i = 0, length = object.length;  
  3.       
  4.             //  
  5.             if ( args ) {  
  6.                 //如果有参数 且object是对象 便利对象 并且用object所对应的属性值来调用callback  
  7.                 if ( length === undefined ) {  
  8.                     for ( name in object )  
  9.                         if ( callback.apply( object[ name ], args ) === false ) //提供一个可以调处循环的机制 如果执行完callback返回的是false 则跳出循环  
  10.                             break;  
  11.                 } else  
  12.                 //如果有参数 且object是数组or元素集合 则....  
  13.                     for ( ; i < length; )  
  14.                         if ( callback.apply( object[ i++ ], args ) === false )  
  15.                             break;  
  16.             } else {  
  17.             //如果没有参数且object是对象 则执行下面的  
  18.                 if ( length === undefined ) {  
  19.                     for ( name in object )  
  20.                         if ( callback.call( object[ name ], name, object[ name ] ) === false )  
  21.                             break;  
  22.                 } else  
  23.                     for ( var value = object[0];  
  24.                         i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}  
  25.             }  
  26.       
  27.             return object;  
  28.         }  
  29. //对象的用法 且没有第3个参数  
  30. each({a:'aa',b:'bb'},function(key,value){  
  31.     alert(key+'---------'+value);  //可以看到第一个参数是对象的属性  第2个参数是该属性对应的值  
  32. });       
  33. each({a:'aa'},function(){  
  34.     for(var i=0,l=arguments.length;i<l;i++){  
  35.         alert(arguments[i])  //可以看出打印出来的是1 2 3 4 5  
  36.     }  
  37. },[1,2,3,4,5]);  
  38. //如果是数组   
  39. each(['a','s','d','f'],function(i,value){  
  40.     alert(value+'---------'+i);  //可以看到第2个参数是数组里面的某项  第1个参数i是该项的索引  
  41. });       
  42. //元素集合的暂时忽略  

 

 

 

browser

 

判断浏览器的类型   根据window.navigator.userAgent字符串来判断浏览器的类型

 

 

  1. +function(userAgent){  
  2. window.browser = {  
  3.     version: (userAgent.match( /.+(?:rv|it|ra|ie)[//: ]([/d.]+)/ ) || [0,'0'])[1],  
  4.     safari: /webkit/.test( userAgent ),  
  5.     opera: /opera/.test( userAgent ),  
  6.     msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),  
  7.     mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )  
  8. };  
  9. }(navigator.userAgent.toLowerCase());  
  10. browser.msie&&(alert('IE'+browser.version));  
  11. browser.mozilla&&(alert('火狐'+browser.version));  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值