jQuery中的函数汇总1
生活随笔
收集整理的這篇文章主要介紹了
jQuery中的函数汇总1
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
歡迎訪問我的github:huanshen,有我的源碼解析
1、each
跟for循環很像,但是更有用,如果你理解了就知道了。
// 遍歷一個數組或者對象// obj 是需要遍歷的數組或者對象// callback 是處理數組/對象的每個元素的回調函數,它的返回值實際會中斷循環的過程// args 是額外的參數數組each: function( obj, callback, args ) {var value,i = 0,length = obj.length,isArray = isArraylike( obj );//如果args存在的話,callback中傳入的參數是grgs,each循環次數確是由obj來確定的if ( args ) {if ( isArray ) {for ( ; i < length; i++ ) {value = callback.apply( obj[ i ], args );if ( value === false ) {break;}}} else {for ( i in obj ) {value = callback.apply( obj[ i ], args );if ( value === false ) {break;}}}// A special, fast, case for the most common use of each//注意下面用的是call,上面是apply//apply 的第二個參數以數組的形式傳入,但是真正運行的時候,//傳入的數組參數會變成一個個的形式,而不是一個數組參數} else {if ( isArray ) {for ( ; i < length; i++ ) {value = callback.call( obj[ i ], i, obj[ i ] );if ( value === false ) {break;}}} else {for ( i in obj ) {value = callback.call( obj[ i ], i, obj[ i ] );if ( value === false ) {break;}}}}return obj;},?2.makeArray
將類數組對象轉化為數組。中間用到了merge函數,具體可見第三個函數,有說明。類數組對象(isArraylike)形如{0:"tt",2:"ccc",length:2};就是屬性是數字形式,同時有length屬性。
// 將類數組對象轉換為數組對象// 此方法為內部方法makeArray: function( arr, results ) {var ret = results || [];if ( arr != null ) {// 如果 arr 是一個類數組對象,調用 merge 合到返回值if ( isArraylike( Object(arr) ) ) {jQuery.merge( ret,typeof arr === "string" ?[ arr ] : arr);} else {// 如果不是數組,則將其放到返回數組末尾// 等同于 ret.push(arr); core_push.call( ret, arr );}}return ret;},關于中間的Object()可以看看下面的結果(暫時不是很清楚具體的作用):
var str="tttt",arr1=[1,2,3],obj={1:0},str2=Object(str);console.log( Object(str))//{0: "t", 1: "t", 2: "t", 3: "t", length: 4, [[PrimitiveValue]]: "tttt"}console.log(str2.length)//4console.log(Object(arr1))//[1, 2, 3]console.log(Object(obj))//{1: 0}3、merge?
可以合并兩個數組或者類數組對象
//把second中的屬性添加到first中//second可以是數組或者類數組對象,又或者包含0,1屬性的東西merge: function( first, second ) {var l = second.length,i = first.length,j = 0;if ( typeof l === "number" ) {for ( ; j < l; j++ ) {first[ i++ ] = second[ j ];}} else {while ( second[j] !== undefined ) {first[ i++ ] = second[ j++ ];}}first.length = i;return first;},?4、map
功能跟each差不多,但是也有不一樣的地方,主要是在處理第三個參數方面。
map: function( elems, callback, arg ) {var value,i = 0,length = elems.length,isArray = isArraylike( elems ),ret = [];// Go through the array, translating each of the items to their//如果是數組,isArray=true;//與each傳入參數順序是一致的if ( isArray ) {for ( ; i < length; i++ ) {value = callback( elems[ i ], i, arg );if ( value != null ) {ret[ ret.length ] = value;}}// Go through every key on the object,//如果是對象} else {for ( i in elems ) {value = callback( elems[ i ], i, arg );if ( value != null ) {ret[ ret.length ] = value;}}}// Flatten any nested arraysreturn core_concat.apply( [], ret );},5、proxy
proxy(),接受一個函數,然后返回一個新函數,并且這個新函數始終保持了特定的上下文(context?)語境。
proxy: function( fn, context ) {var tmp, args, proxy;if ( typeof context === "string" ) {tmp = fn[ context ];context = fn;fn = tmp;}// Quick check to determine if target is callable, in the spec// this throws a TypeError, but we will just return undefined.if ( !jQuery.isFunction( fn ) ) {return undefined;}// Simulated bind//如果傳入的參數多余2個,把多余的參數轉變為數組。args = core_slice.call( arguments, 2 );proxy = function() {//這里用到了柯里化return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );};// Set the guid of unique handler to the same of original handler, so it can be removedproxy.guid = fn.guid = fn.guid || jQuery.guid++;return proxy;},柯里化(Currying)是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,并且返回接受余下的參數且返回結果的新函數的技術。具體可以看下面這個示例:可以看到前面兩個參數并沒有輸出,最后一個參數和新的參數組成數組輸出。在上面就是作為參數傳入proxy中
function t (l,t,y){var args = [].slice.call( arguments, 2 );console.log(args)function t(){console.log(args.concat([].slice.call( arguments )));}return t;}var tt=t(1,2,3);tt("t");//[3,"t"]?
總結
以上是生活随笔為你收集整理的jQuery中的函数汇总1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Heron 数据模型,API和组件介绍
- 下一篇: Stack View的与众不同