$(function(){
var $div = $('div' );
var args = [":參數" ]
$div.each( function(){
alert( this.id + arguments[0]);
return false ;
},args); //只彈出一次 div1:參 數
});
JQuery.each(obj, callback, args)的源碼也比較簡單,見註釋
// args is for internal usage only
each: function( obj, callback, args ) {
var value,
i = 0,
length = obj.length,
isArray = isArraylike( obj );
//如果有參數
if ( args ) {
//如果是類數組
//則用使用obj[下標]的方式訪問迭代的元素
if ( isArray ) {
for ( ; i < length; i++ ) {
//綁定回調函數的執行作用域,即回調函數使用this時,this指向當前迭代的元素,回調函數的參數爲傳入的args
value = callback.apply( obj[ i ], args );
//如果返回false,退出迭代
if ( value === false ) {
break;
}
}
//如果不是是類數組
//則用for-in迭代
} 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
//和上個分支的處理一樣這
//只是沒有傳入args
//大量的重複代碼是爲了更少的邏輯判斷,匹配最長用的方式,使處理更快
} 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;
}
}
}
}
//返回要迭代的obj,通常是jquery對象
return obj;
},
Test_Html
var $div = $('div' );
$div.map( function (){
return this .parentNode;
}).each( function (){
alert( this .tagName); //彈出兩次 BODY
});
map: function( callback ) {
return this .pushStack( jQuery.map( this, function ( elem, i ) {
return callback.call( elem, i, elem );
}));
},
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 new values
if ( isArray ) {
for ( ; i < length; i++ ) {
//嗲用callback綁定執行作用域爲當前迭代元素
value = callback( elems[ i ], i, arg );
if ( value != null ) {
//將返回值推入數組末尾
ret.push( value );
}
}
// Go through every key on the object,
} else {
for ( i in elems ) {
value = callback( elems[ i ], i, arg );
if ( value != null ) {
ret.push( value );
}
}
}
// Flatten any nested arrays
return concat.apply( [], ret );
},