本家のドキュメントにその記述が無かったんですが、ソースを読むと明らかに二通り の使い方がありました。一つは、ドキュメントの通りに each の引数はコールバック のみを渡して、第一引数はインデックス番号で、第二引数は this と同じものが使え るというものです。 しかし、もうひとつでは each の引数にはコールバックともうひとつ配列を渡せるよ うになっていて、その場合はそれぞれのコールバックの引数には配列の値が一つ一つ 渡されるというものです
<a href="#" target="_blank">001</a> <a class="test" href="http://winofsql.jp" target="_blank">001</a> <a class="test" href="http://toolbox.winofsql.jp" target="_blank">002</a> <script type="text/javascript" src="https://www.google.com/jsapi"></script> <script type="text/javascript"> google.load("jquery", "1.7.1"); </script> <script type="text/javascript"> // ドキュメントに無い使い方 $(".test").each(function(i,me){ console.log(i+" "+me.href+" "+this.href); },['これは',{href:"秘密の使い方"}]); // 普通の使い方 $(".test").each(function(i,me){ console.log(i+" "+me.href+" "+this.href); }); </script>
以下はその該当部分( jquery-1.7.1.js ) ※ callback.apply で呼び出しています
// args is for internal usage only each: function( object, callback, args ) { var name, i = 0, length = object.length, isObj = length === undefined || jQuery.isFunction( object ); if ( args ) { if ( isObj ) { for ( name in object ) { if ( callback.apply( object[ name ], args ) === false ) { break; } } } 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 ( isObj ) { for ( name in object ) { if ( callback.call( object[ name ], name, object[ name ] ) === false ) { break; } } } else { for ( ; i < length; ) { if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) { break; } } } } return object; },
この中では、each に渡されるオブジェクトが length の無い通常オブジェクト も想定されているのですが、$( {} ) では動作しませんでした。もし、その場合 で動くのであれば、インデックスのかわりにプロパティ名が渡る事になっていま す。 ( ※ 動作しなかったと言うのは、配列扱いされてしまっていたという事です )
タグ:jquery