JavaScript関数の引数について

このQ&Aのポイント
  • JavaScriptの関数に渡される引数について分かりません。
  • 特に、445行目のEnumerable.each、521行目のincludeメソッドの引数の挙動が分かりません。
  • この場合、valueとobjectの引数には何が入るのでしょうか?
回答を見る
  • ベストアンサー

JavaScriptの関数に渡される引数について

Yahoo!知恵袋(http://detail.chiebukuro.yahoo.co.jp/qa/question_detail.php?qid=1469303224)に質問したのですが、補足の文字数が少ない上、返信が出来ないため、申し訳ございませんがこちらで質問させていただきます。 ご回答の中で無名関数というのは分かったのですが、やはりどうしても各プロパティの引数の挙動が分かりません。 445行目のEnumerable.each、521行目のinclude等の場合はどうなのでしょうか? 521: include: function(object) { 522: var found = false; 523: this.each(function(value) { 524: if (value == object) { 525: found = true; 526: throw $break; 527: } 528: }); 529: return found; 530: }, の場合はEnumerable.include(a)と使うと思うのですが、この場合object=aでしょうがvalueには一体何が入っているのでしょうか? value==(object=a)の式比較の意味が分かりません。 それまで存在していないのでundefinedとかかなと思うのですが、それでは意味が通じませんので。 445: var Enumerable = { 446: each: function(iterator) { 447: var index = 0; 448: try { 449: this._each(function(value) { 450: iterator(value, index++); 451: }); 452: } catch (e) { 453: if (e != $break) throw e; 454: } 455: return this; 456: }, の場合もiterator、valueの引数も分かりませんし、iteratorという関数を無名関数の中で使用しているようですが、自分には挙動がちょっと分かりませんでした。

質問者が選んだベストアンサー

  • ベストアンサー
  • my--
  • ベストアンサー率89% (91/102)
回答No.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

chopperin
質問者

お礼

ありがとうございました。 Array.prototype._eachを見落としていました。 で、他にもgsub()もようやく理解が出来ました。 本当にありがとうございました。

その他の回答 (1)

noname#212058
noname#212058
回答No.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 なのはわかりますね。 もうひとつのコードのほうもこれと仕組みは同じです。 関数ポインタは慣れると非常に強力な仕組みなのですが、 コードが読みにくくなるのが難点です。

chopperin
質問者

お礼

ありがとうございました。 ようやく理解が出来ました。 やはりご指摘のとおり、ほぐして考えないと分かりにくかったです。 本当にありがとうございました。

関連するQ&A

  • 戻り値のリテラル関数の引数の出所はどこなの?

    お世話になっております。現在JavaScriptの勉強をしております。 その一環としてPrototype.js ver 1.6.1 を解読しているのですが Enumerable 等のメソッドで出てくる return でリテラル関数を指定するような部分が多々見受けられるのですが…この意味がイマイチ感覚がつかめず困っています。 例:Prototype.js 702行目付近 Enumerable = (function(){... の collectメソッド(743行目付近) function collect(iterator, context) { iterator = iterator || Prototype.K; var results = []; this.each(function(value, index) { results.push(iterator.call(context, value, index)); }); return results; } などの this.each(function(value, index) { results.push(iterator.call(context, value, index)); } 部分で function(value, index)... とあるvalue, index はどこでどれから指定されるのかがよくわかりません。 [1,2,3,4].collect(a,b); と呼び出した場合、collect(a,b){... と呼ばれますが value と indexには何がどうやって指定されるのでしょうか? このような記法が把握できず、混乱を極めている状態です。 どなたかお手数ですがお教え願えないでしょうか? よろしくお願いいたします。

  • JavaScriptで関数設定時に引数を指定したい

    状況を説明します ・複数のthにoncklickイベントで同じ関数を呼びたい ・th要素のタグにonclick属性を書くのは同じ記述をたくさん書くことになるのでやりたくない ・JavaScriptでonclick属性に関数を設定したい ・th要素自身を引数としたい ※WindowsXPのIE8で動けばOKです。 (0)ベタ書きするとこんな感じになります。これなら動くことを確認しています。 # <th onclick="func1(this)">… # <th onclick="func1(this)">… # <th onclick="func1(this)">… # <th onclick="func1(this)">… # # function func1(th) { #   … # } (1)引数がなければこんな感じになると思います # var ths = $("head").childNodes; # for (var i = 0; i < ths.length; i++) { #   ths[i].onclick = func1; # } (2)無名関数ならこんな感じになると思います # var ths = $("head").childNodes; # for (var i = 0; i < ths.length; i++) { #   ths[i].onclick = function() { #     … #   } # } しかしこの2つの書き方「(1)(2)」とも、引数を入れようとしたところ どうすればいいかわかりませんでした。 上記の状況を踏まえ… 質問は以下です ・(1)のような書き方で、引数アリの関数を設定する方法 ・(2)のような書き方で、引数アリの関数を無名関数で設定する方法 ・それ以外の代替方法 これを教えてください。 そもそもJavaScriptではできないのであればその旨を教えてください。 よろしくお願いします。

  • function()は無名関数?

    jqueryの$(function() は無名関数だと思いますが、redyが省略されているので、DOMを読み込み終わってから実行とも聞きます。 両方の意味があるのでしょうか? 一見ダダの無名関数に見えますがどのように区別するのでしょうか? 下記の部分もfunction()があるのですがこちらもまた無名関数のなのですか? ただ即時関数ではないので変数などに入れて、関数の呼び出しをしないといけないのにその記載がなくても実行されるのはなぜでしょうか? each(function() $(function() { $(".textbox").each(function(){ var labelText = $(this).val(); $(this).focus(function(){ if( $(this).val() == labelText ){ $(this).val(""); } }).blur(function(){ if( $(this).val() =="" ){ $(this).val(labelText); } }); }); }); 補足 $(".textbox").each(function(){ var labelText = $(this).val(); $(this).focus(function(){ if( $(this).val() == labelText ){ $(this).val(""); の部分は無名関数の中身、つまりこの関数が実行されるときの中身のことなのでしょうか? jqueryだと何となくこの書き方をしているのですがJSの基礎で考えるとそのようになりますよね?

  • 関数の引数とグローバル変数について

    javascript初心者です。 どうしても分からないことがあるので質問させて頂きます。 グローバル変数の値を関数で処理して増やしコンソールログに表示していく、 というようなソースがあるとします。(以下) //グローバル変数 var a = 0; var b = 0; var c = 0; //計算する関数 var afunc = function(){   a++;   console.log(a); } var bfunc = function(){   b++;   console.log(b); } var cfunc = function(){   c++;   console.log(c); //onclickなどで呼び出す関数 function test1(){   var aplus = new afunc(); } function test2(){   var aplus = new bfunc(); } function test3(){   var aplus = new cfunc(); } グローバル変数や関数などが3つと数が少ないならこれでもいいかも知れませんが、 これが数十個とかに増えると、ソースの量もかなり多くなり 管理も大変になると思い簡略化させたいと考えました。 そこで以下のように変えてみたのですが、 加算がうまくいきません。 //グローバル変数 var a = 0; var b = 0; var c = 0; //計算する関数 vvar xxfunc = function(xx){   this.xx = xx;   this.show = function() {     this.xx++;     console.log(this.xx);   } } //onclickなどで呼び出す関数 function test1(){   var aplus = new xxfunc(a);   aplus.show(); } function test2(){   var aplus = new xxfunc(b);   aplus.show(); } function test3(){   var aplus = new xxfunc(c);   aplus.show(); } もしかすると、関数の引数にはグローバル変数を指定することができないのでしょうか? 何かうまいやり方はあるでしょうか? プログラミング自体が勉強し始めたばかりなので、 おかしなソースの書き方をしているかもしれませんのが、 ご教授、よろしくお願いいたします。

  • 関数を呼んだら、その中の関数も自動実行される?

    ・関数の実行タイミングが分からないので教えてください ・下記で、どうして引数が渡るのでしょうか? ・portal関数を呼んだら、gooプロパティに無名関数が格納される(?)と思うのですが、=関数実行になるのでしょうか? ・無名関数だから? var obj = {  portal : function( arg ) {   var goo = function(arg){    console.log(arg);   }(arg);  } } obj.portal("あ"); ・自分的には、portal関数を呼んで変数gooに無名関数を格納(?)した後、明示的にgoo();と呼ぶ必要があると思うのですが… ・下記でTypeErrorエラーになるのは、gooプロパティが2回呼ばれるから? ・明示的に呼んだ2回目は引数が渡らないから? var obj = {  portal : function( arg ) {   var goo = function(arg){    console.log(arg);   }(arg);   goo();  } } obj.portal("あ"); //TypeError: undefined is not a function

  • 無名関数を使うメリットは何ですか?

    Javascriptに限らず、多くのプログラム言語で無名関数が使えると思います。以下の2つの記述法は、挙動に違いは全くありませんよね? function func() { return "普通の関数です。"; } var func = function() { return "無名関数です。"; } なぜ無名関数を使うのか調べてみたところ、「最近Ajaxが流行ってきてライブラリを使う機会が増えてきた。それらを利用する際、関数の名前が重複して誤作動するのを防げる」という答えを見つけました。しかし試してみたところ var func = function() { return "無名関数1です。"; } var func = function() { return "無名関数2です。"; } alert(func()); のように名前が被った場合、従来と同じで後に書かれた関数が動作します。イベント駆動型関数を無名関数にするメリットは分かります。たとえば window.onload = function() { alert("ウィンドウの読み込みが完了しました。"); } と書けば、他の関数との衝突によってこの関数が動作しないことはありません(ライブラリを使ってwindow.onloadが重複してしまったら別問題ですが)。 結局のところ、無名関数を使うメリットは何なのでしょうか?

  • イベントの関数について、よくわからないことがあります。

    イベントの関数について、よくわからないことがあります。 (1)引数をセットしない関数と window.document.onmousemove = f; function f(evt) { alert(evt); } (2)無名関数?に引数 window.document.onmousemove = function(e) { alert(e); } (1)(2)は同じ動作なのですが、window.document.onmousemoveにセットする関数の引数は 特殊なのでしょうか?

  • オブジェクトの中で呼び出される順番とデフォ引数?

    ・意味が分からないコードがあるので教えてください ■コード var arg; var obj = {  hoge : function( arg ) {   var hoge = function(arg){    return function() {    }   }(arg);   hoge();  } } ■質問 ・この時、obj.hoge(arg);と書いたら、どういう処理が走るのでしょうか? ・初めに実行されるのは? 無名関数部分? それともhoge()? ・hoge()を実行する際、引数指定していないので、引数は渡らない?

  • ラジオボタンの値を取得する引数付き関数を作りたい

    フォームの入力内容をチェックするJAVASCRIPTの関数を作成していますが、ラジオボタンのValueを取得することができません。 引数指定の関数を作成して汎用的に使用したいと考えているのですが、引数を渡すと値を返してくれません。 引数の渡し方がおかしいのでしょうか? function getRadioValue(str){ // 値を取得する関数 var check, num, value="none"; num=document.form1.str.length; for (i=0;i<num;i++) { check=document.form1.str[i].checked; if (check) value=document.form1.str[i].value; } return value; } function check(){ // 入力内容をチェックする if (getRadioValue("タイプ") == "A"){ hogehoge } : : }

  • 「引数の書き方」と「メンバ変数とメンバ関数の名前」について、教えてくだ

    「引数の書き方」と「メンバ変数とメンバ関数の名前」について、教えてください。 クラス内のコード抜粋なのですが、下記はどういう意味なのでしょうか? ▼メンバ変数 var $j = true; ▼メンバ関数 function j($p = false){ if($p) $this->j = false; return $this->j; } $this->j(true); 分からないこと ・コードの意味全般 ・($p = false)と書かれている引数の意味 ・メンバ変数とメンバ関数の名前は同じでもよいか? 

    • ベストアンサー
    • PHP

専門家に質問してみよう