おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

roppongi.js#4

roppongi.jsに参加するたびに、もっとjavascript勉強しなきゃなーという気持ちになります。勉強会の内容メモは後で書きます。(2008/07/03追記しました。)

今回のroppongi.jsではeachメソッドについて勉強しました。

137:each

短いのでソースそのまま載せます。argsは内部でしか使われない引数で、この定義の中で使われているeachメソッドは別のeachのようです。

each: function( callback, args ) {
  return jQuery.each( this, callback, args );
}

724:each

上記で呼ばれているeachはここで定義されています。jQuery.extend()の引数として定義されていますが、理由はよくわかってません。少し長いですがこれも載せてしまいます。

each: function( object, callback, args ) {
	var name, i = 0, length = object.length;
	if ( args ) {
	  if ( length == undefined ) {
	    for ( name in object )
	      if ( callback.apply( object[ name ], args ) === false )
		break; // *2
	  } else
	    for ( ; i < length; )
	      if ( callback.apply( object[ i++ ], args ) === false )
		break;
	  
	  // A special, fast, case for the most common use of each
	} else {
	  if ( length == undefined ) {
	    for ( name in object )
	      if ( callback.call( object[ name ], name, object[ name ] ) === false )
		break;
	  } else
	    for ( var value = object[0];
		  i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} // *1
	}
	
	return object;
      }

argsのあるなし、objectが配列っぽいオブジェクトか否かで分岐します。

$(".hoge").each(function(){
  //...
})

のような場合は一番下の分岐(*1のところ)を通ります。戻り値はjQueryオブジェクト自身。

$(".hoge").each(function(){
  //...
})

例えば上記のコードの戻り値は

$(".hoge")

と同値になります。