- ベストアンサー
JavaScript関数の引数について
- JavaScriptの関数に渡される引数について分かりません。
- 特に、445行目のEnumerable.each、521行目のincludeメソッドの引数の挙動が分かりません。
- この場合、valueとobjectの引数には何が入るのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Prototype JavaScript framework, version 1.5.1 line:669 Array.prototype._each = function (iterator) { for (var i = 0, length = this.length; i < length; i++) iterator(this[i]); }; var arr = [0, 1, 2, 3]; arr._each(function (value) { alert(value); }); _eachメソッドです。 配列(this)要素を順に受け取った関数オブジェクト(iterator)に渡し実行します。 実際のコードとは違いますがEnumerableオブジェクトの各プロパティは後に Array.prototype他の拡張に使われています。 thisをarrに置き換えれば、valueに何が入るのか分かると思います。 これを踏まえて、下記コードを追ってみて下さい。 Array.prototype.each = function (iterator) { for (var i = 0, length = this.length; i < length; i++) { if (iterator(this[i]) === false) break; } }; Array.prototype.include = function (obj) { var found = false; this.each(function (value) { if (value == obj) { found = true; return false; } }); return found; }; var arr = [0, 1, 2, 3]; arr.include(1); // true
その他の回答 (1)
無名関数と 『関数オブジェクトの参照』 を引数に渡す話ですね。 これはどれが、どこで実行されるかを丁寧にほぐさないと、すぐに 迷子になります。 521行目の include このコードは、ほぐすと以下のようなコードになります。 function include(object) { var found = false; this.each( 無名関数 ); return found; } function 無名関数(value) { if (value == object) { found = true; echo(value); throw $break; } } 注) 無名関数 を include メソッドの外に出してしまうと、object は undifined になってしまいます。わかりやすさを優先してこう書き ましたが、このコードは元のコードとそういう意味で一致して いません。 this.each メソッドに 「無名関数」 というメソッドそのものを入れて いるのがわかりますね。このとき、this.each メソッドは例えば 以下のように記述されます。 each: function( 引数関数 ) { // ← メソッドを引数で受け取る 引数関数( "あああ" ); // ← 引数をメソッドとして実行する } 整理しましょう。 1. include( a ) を実行する 2. include メソッド内で、this.each メソッドを 「無名関数」 を引数 として実行する 3. this.each メソッド内で、引数 「引数関数」 を "あああ" を引数 として実行する # this.each の引数は 「無名関数」 メソッドなので、「無名関数」 # が "あああ" を引数として実行される 4. 無名関数メソッド内の if (value==object) が実行される。 ここまでくれば、value="あああ"、object=a なのはわかりますね。 もうひとつのコードのほうもこれと仕組みは同じです。 関数ポインタは慣れると非常に強力な仕組みなのですが、 コードが読みにくくなるのが難点です。
お礼
ありがとうございました。 ようやく理解が出来ました。 やはりご指摘のとおり、ほぐして考えないと分かりにくかったです。 本当にありがとうございました。
お礼
ありがとうございました。 Array.prototype._eachを見落としていました。 で、他にもgsub()もようやく理解が出来ました。 本当にありがとうございました。