• ベストアンサー

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

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

  • re97
  • お礼率80% (601/744)

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

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

hogeが2種類使われているので、説明上の区別がし難いですが… obj.hoge()が呼ばれると、objのhogeメソッドが実行されます。 hogeメソッドは内部変数hogeに(argの値に従って)関数をセットし、その関数(hoge)を実行します。 引数は、内部変数hogeを定義する際に参照可能なので、間接的にはhogeでもargの値を参照できます。 (参照するかしないかは、関数の作成方法や結果によります) それなので、最初にobj.hogeメソッドが実行され、その処理中で新たに定義された hoge()が実行されるという順になります。。 例えば、単純に   return function(){ alert(arg); } などとなっていれば、引数argの値がalertされるはずです。 (ただし、この場合はこんな記述方法をする必要はまったくありませんが…) あるいは、  if(arg>0) return function(){ ○○○○ };   else return function(){ ×××× }; みたいにすれば、argの値によって実行する関数が切替わるイメージになります。 メソッドの処理中でargの値によって処理を変えれば、「関数を定義して実行する」ようなことはしなくても、内容的に同じ処理を行なうことは可能です。 内部の変数hogeの名称を変えてあげれば、少し理解しやすくなるのではないでしょうか。

re97
質問者

お礼

回答ありがとうございました。 >内部の変数hogeの名称を変えてあげれば、少し理解しやすくなるのではないでしょうか ・そうですよね ・もしかしてjavascript的に何か特別な意味があるのかもしれない、と思い質問してみたのですが…

その他の回答 (1)

  • b0a0a
  • ベストアンサー率49% (156/313)
回答No.2

>>どういう処理が走るのでしょうか? 普通にこれが上から順に実行されます var hoge = function(arg){  return function() {} }(arg); hoge(); >>初めに実行されるのは? 無名関数部分でhogeにfunction() {}が入ります 次にhoge()でその関数が呼ばれます >>引数は渡らない? はい

re97
質問者

お礼

回答ありがとうございました。 >普通にこれが上から順に実行されます >引数は渡らない? >はい ・そうですよね ・私もそう思ったのですが…、もしかして、何か特別な意味があるのかと思い質問しました…

関連するQ&A

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

    ・関数の実行タイミングが分からないので教えてください ・下記で、どうして引数が渡るのでしょうか? ・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

  • PHP シェルスクリプト 引数

    失礼します。現在PHPからシェルスクリプトを引数を付けて実行し、戻り値で確認が出来るか試しているのですがなかなか参考になる記事がなく実現が出来ない状態です 調べたところ、 phpからhoge.shというシェルファイルをargという引数で実行したいとします。 引数を"'. .'"で囲う事で、引数を渡せるようです。 $output = shell_exec('/bin/sh /path/to/hoge.sh "'.$arg.'"') var_dump($output) 上記のような記事を見つけたのですがhoge.shはどのように$argを受け取り、戻り値を渡しているのでしょうか?また、$argの値の中身は渡す引数の内容という認識で正しいのでしょうか?サンプルコードなどがあるとうれしいです。 ご教授よろしくお願い致します。

  • javascriptのコードについて

    以下のコードなのですが、 エンクロージャー関数の ローカル変数hogeをさらに、エンクロージャー内部で定義された 関数ででクロージャーとして保持させたいメソッドのコードですが var Method = function (){ var hoge = "初期値"; var getter = function (){ return hoge; } var setter = function (param){ hoge = param; return hoge; } return {"set" : setter,"get" : getter} } var obj = Method(); console.log(obj); console.log(obj . get()); obj.set("初期値変更"); console.log(obj.get()); obj . set("更に変更"); console.log(obj.get()); この場合、メソッドの返り値として、一般的な文献に乗っている関数(関数オブジェクト)を返すのではなく オブジェクトリテラルとして返しています。 この場合でも、動きとしてはクロージャーの動きをしているのでhogeという変数の保持はできているっぽいんですが クロージャーって関数内で定義された関数であれば、どういう返り値の返し方でも クロージャーになるのですかね? また、この方法は、一般的にjsで関数コンストラクタ呼び出しをしてインスタンスを作る際privateメンバを実現する方法として紹介されていますが、 これはクロージャーとして生成するたんびに内部の変数を保持するためメモリ食い虫になるらしいのですが まず間違いなく、このクラス(便宜上そう呼びます)のインスタンスはひとつしかつくることはない!!という仕様だとしても いけないのでしょうか? というかもう現状javascripのバッドノウハウ的なものになっているのでしょうか?

  • 引数について質問

    私プログラミング初心者ですので、できるだけ優しい解説をしていただければ幸いです! 引数について、以下のような解説がありました。 「引数には仮引数と実引数の2種類が存在する。仮引数は、関数を定義する際に変数で指定する引数である。また、実引数は、プログラムの実行時に関数に引き渡される値となる引数である。つまり、関数の実行時には、実引数の値が仮引数に代入されることになる。」 質問:1「関数を定義する際に変数で指定する引数である。」という記述の中で「関数を定義」とありますが、実際のソースコードにおいて何に対応するかわかりません。簡潔なソースコードを交えて解説していただければ幸いです。 質問2:「関数を定義」に限らず、プログラミングにおいて「定義」という言葉をよく見ますが、これは本質的にどういう意味をもっているのでしょうか?具体的なソースコースコードを交えて解説してくださると幸いです。 もしかして、その定義とは例えば「public static void main(String arg[]){」のような「メソッド宣言」のことですか? 質問3:「関数の実行時には、実引数の値が仮引数に代入されることになる。」と書いてありますが、 これはどういうことですか、僕が実際にソースコードで記述してみるので、その考えが正しいか判定してください package 第4章; public class A { public static void main(String arg[]){ double x; x=Math.sqrt(2.0); System.out.println("2.0の平方根は"+x); } } 僕の考え:String arg[]が仮引数で、実引数2.0がString arg[]に代入されるってことでしょうか? 「定義」といえば、上記のソースコードでは、public static void main(String arg[]){ 以外見当たらないので、、 僕の考え2:Mathクラスは、標準クラス(javaが最初から備えているクラス)だから、プログラマが「関数を定義」しなくても予め関数が定義されているから、関数を定義する必要がない、ということでしょうか?

    • ベストアンサー
    • Java
  • 配列の中身を順番に可変長定義関数に渡すには

    好きなだけ引数が渡せる関数があり、その引数に任意の配列の中身をeval関数を使わずに一つずつ渡したいのですが、どうすればいいのでしょうか。eval関数を使った場合は以下のような感じです。 $list=array("apple","banana","orange"); function hoge(){ print_r(func_get_args()); } $arg=implode ('","',$list); eval('hoge("'.$arg.'");');//hoge("apple","banana","orange"); よろしくお願いいたします。

    • 締切済み
    • PHP
  • 本文ではなく、returnへほとんどの処理を記述

    ・本文ではなく、returnへほとんどの処理を記述しているコードがあります ・どういう意図があるのでしょうか? ・複数の関数をreturnする関数が、たくさんあります ・どの関数も、関数本文より、returnする関数内容の方が何倍も多いです hoge = function(){  //中略   return {    a : function(){   },    b : function(){  //これが延々続く  //return関数内で即時関数実行したり ■質問1 ・処理の結果をreturnすると思っていたのですが、returnメインでそこに処理を記述していくやり方のメリットは? ■質問2 ・hoge.aでアクセスしているのですが、関数定義=オブジェクト定義でしょうか? ・下記aメソッドは、同じ意味? hoge = {  a: function(){ hoge = function(){  //中略   return {    a : function(){   },

  • OpenOffice Basicで引数を2つ利用する関数が作れません

    OpenOffice Basicで引数を2つ利用する関数が作れません Open Office Calc 3.1.1を使っています。 できれば複数(3つ以上)引数を取る関数を作りたいのですが、 2つ引数を取ろうとすると演算結果が#NAME?になってしまいます。 切り分けにシンプルな関数を作ってみました。 以下で=test2(3,5)とすると結果が#NAME?になります。 Function test2(arg1 As Integer, arg2 As Integer) as Integer test2 = 3 + arg2 End Function #なお、関数内の演算内容はtest2 = arg1 + arg2でも変わらず#NAME?です 切り分けで以下を作ると=test3(3)で6が返されます Function test3(arg1 As Integer) as Integer test3 = 3 + arg1 End Function 関数名のタイプミスの可能性を排除するために、 test2関数を名前を換えずに引数の数を1つに変更してみると 計算できるのでタイプミスではないと思います。 やはり引数を複数とる取り方に問題があるように見えます。 お手数ですが何かアドバイスいただけないでしょうか?

  • オブジェクトの内容を確認する方法

    JavaScriptでオブジェクトの中身を確かめたいときに、 JSON.stringifyや下の関数のようなやり方がありますが、 var showObj = function(obj) { var props = ""; for (var prop in obj){ props += prop + "=" + obj[prop] + "\n"; } return props } JSON.stringify(Math)//{} showObj(Math)// となり、Mathオブジェクトの中身は確認できませんでした。 これはどういった理由によるものなのでしょうか。 また、(JavaScriptのコードから)確認する方法はあるのでしょうか。

  • 配列の中身を全て順番に別の関数へ引数として渡すには

    配列の中身を全て順番に別の関数へ引数として渡すには、どうすればよいでしょうか? このままだと、'null' は Null またはオブジェクトではありません。 となります。 function piyo(hoge){ alert(hoge); } for (var i = 0; i < hogearray.length; i ++) { piyo(hogearray[i]);//ここを通ったら、順番の関数を呼び出すようにしたい } また、グローバル変数として渡すには、どうすればよいでしょうか?

  • クラスの中のクラスへのアクセス

    お世話になります。 クラスが以下のようにあります。 class ClassName1{ var $classname2_obj; // クラス「ClassName2」のオブジェクト function getClassName2Obj(){ return $this->$classname2_obj; } } class ClassName2{ var $array_list; // 配列です  function getArrayList(){ return $this->array_list; } } やりたいのは、ClassName1のgetClassName2Obj関数でClassName2の配列をgetArrayListで取得したいのです。 $a = new ClassName1; $b = $a->getClassName2Obj(); $c = $b->etArrayList(); 上の$b = … と$c = …の部分の処理を一行にまとめることはできないでしょうか? 何卒よろしくお願い致します。 PHPは5です。

    • ベストアンサー
    • PHP

専門家に質問してみよう