• 締切済み

return の中はローカルスコープ?

return 範囲内における、ローカル / グローバルスコープについて教えてください ■質問 ・returnするまではローカル変数? ・returnしたらグローバル変数? ・それとも、「return の中」というスコープは存在しない? ■例1 (function(){  return{   //ローカルスコープ?   //ここで定義した変数はローカル変数?  } })(); ■例2 (function(){  return{   hoge : (function(){    //ローカルスコープ?    //ここで定義した変数はローカル変数?   })()   }; })();

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

みんなの回答

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

return文で返す「値」にスコープはありません。 【例】 return a + b; この場合、aやbのスコープに関わらず、a+bという 一時的に計算した値が返りますね。この値はこの一瞬 だけしか存在しないので、呼び出し側が変数で受け 取らない限り、消滅します。 この「一瞬の値」のスコープは?という問いには 「ありません」と言う他ないですね。 尚、掲題プログラム中にある「?」は全て「はい」 です。

  • byDesign
  • ベストアンサー率75% (45/60)
回答No.2

スコープとは『変数』がどこまで参照可能かという事です。 その為、returnのスコープというのはおかしな話です なぜなら、変数を宣言していないのに、どの変数の事を言っているのか?という話になります。 ここで勘違いしては駄目なのは、『変数』と、その中の『オブジェクト』は別物ということです。 オブジェクトは、変数に入れないと使う事が出来ません。 例えば { hoge : function(){} }; なんて書いても、変数に入れない限りhoge関数を呼べません。 var piyo = { hoge : function(){} }; piyo.hoge(); 変数に入れる事で、初めて使えるようになります。 そして、returnで返すのは変数ではありません、オブジェクトです。 この返却したオブジェクトを使用したければ、呼び出し元の変数に入れる事で使用可能になります。 function A() {  var piyo = { hoge : function(){} };  return piyo; } function B() {  var piyo = A(); } 最初に言ったとおりスコープとは変数がどこまで使用可能かということです。 A関数で宣言した『変数piyo』のスコープはA関数内 B関数で宣言した『変数piyo』のスコープはB関数内 そして、それぞれ関数で宣言したの変数piyoは別物です しかし、その中身の『オブジェクト』は同一です このように、変数とオブジェクトは違うものだという事を理解しましょう。 次に、ローカルスコープとグローバルスコープについて まず、javascriptの変数は関数内に変数の宣言が無ければ、親関数に探しに行き、そこにも無ければその親関数にと言うように、変数の宣言が無い場合親関数に探しに行きます。 function A(){  var x = 1;  function B(){   var foo = x + 1;  } } B関数内で使用している変数(x)は、B関数で宣言していませんが、親のA関数で宣言しているので、A関数の変数(x)を使用します。 --- my.js ここから---- x = 0; function B(){  var foo = x + 1; } --- my.js ここまで---- 上記のようなjavascriptを作成した場合 それを包む(Auto)関数が自動的に作成されるとイメージしてください。 function Auto(){  x = 0;  function B(){   var foo = x + 1;  } } 上で説明したように、変数宣言がない場合、親関数を探します。 どこにも宣言がなければ、最終的に(Auto)関数に探しにくる訳ですが この関数の親はいないので、ここに探しにくる変数はすべて(自動で)宣言されるようになっており この関数で宣言された変数のスコープをグローバルスコープといいます。 また、それ以外はローカルスコープです。 結局、スコープは、変数がどこまで参照可能かと言うことで グローバルスコープで宣言されている変数は、どこからでもアクセス可能なので、グローバルスコープという特別な名前を付けていますが、ローカルスコープにはできない何か特別な機能があるなどと言う事はありません。 # javascriptファイルを複数使用する場合、全ファイル結合しそれを包む(Auto)関数が作成されるイメージ # Auto関数は仕様で規定されているわけではなく、イメージしやすいように私が勝手に作った関数なので、Auto関数という名前で実際に作られていません。あくまでイメージです。

  • chie65535
  • ベストアンサー率43% (8518/19364)
回答No.1

>■質問 >・returnするまではローカル変数? 「ブロック内のローカル変数」であるので、ローカル変数。 >・returnしたらグローバル変数? 「関数の戻り値」は、ローカル変数でもグローバル変数でもない「(式中で揮発する)一時変数」である。 >・それとも、「return の中」というスコープは存在しない? 存在しない。 「{」と「}」で括られた部分を「ブロック」と言い、ブロック内で宣言された変数のスコープは「ブロック内」となる。 関数本体も「{」と「}」で括られた部分なので、広い意味で「ブロック」と言える。

関連するQ&A

  • スコープについて

     PHPの変数スコープでは、global変数をglobalキーワードを使って、localに持ち込むことや、$GLOBALSを利用して呼び込むことができますが、local変数を関数の外(つまりglobal変数として)に持ち出すにはどうしたらよいのでしょうか? <? function example() { //なんらかの処理 $flag = 1; //なんらかの処理 } echo $flag; ?> これだと駄目なんですよね? returnで返す値にはその他のものが入っていて、一部のローカル変数のみを一時的にグローバル化したい…と思っています。  よろしくお願いします。

    • ベストアンサー
    • PHP
  • onclick指定関数の引数へローカル変数をセット

    ・onclick指定関数の引数として、ローカル変数をするにはどうすれば良いでしょうか? ・下記例だと、kokoをローカル変数で定義したい <input type="button" onclick="hoge(koko);"> ■現状 ・変数kokoスコープをグローバルで設定しているので無事渡せて(?)ます ■質問背景 ・変数はグローバルにしない方が良いと聞いたことがあるので、何か方法があるのかなと思い質問しました

  • C#での変数スコープ?

    Net 2.0のC#で同一名の変数を使う場合について質問いたします。 以下のHoge1の場合には「 ローカルの変数 'x' をこのスコープで宣言することはできません。これは、'親またはカレント' スコープで別の意味を持つ 'x' の意味が変更されるのを避けるためです。」と怒られます。 一方、Hoge2の場合には怒られません。 Hoge2内でx=1;ではなくint x=1;と再宣言しているにもかかわらず怒られないのは、Hoge1が厳格にスコープ管理している点からみると意外に感じられます。 http://www.atmarkit.co.jp/ait/articles/0210/16/news001_5.html の記述を見ると、この記事が書かれた2002年ごろにはHoge2もNGだったような印象を受けるのですが、変化があったのでしょうか? この辺りの事情に詳しい方がおられましたらよろしく、お願い申し上げます。 class Class1 {    private void Hoge1()    {       int x;       {          int x = 2; // これはNG!。「ローカルの変数 'x' をこのスコープで宣言することはできません。これは、'親またはカレント' スコープで別の意味を持つ 'x' の意味が変更されるのを避けるためです。」と怒られる。       }    }    int x;    private static void Hoge2()    {       int x=1; //これはOK!親にぶらさげた変数が通る。    } }

  • スコープについて

    グローバル変数とポインタが定義されているファイル外でもスコープが適用となるのかどうかが判りません。 ローカル変数は関数内ですよね。 グローバル変数はどの関数内でも値を変えられる。ポインタも受け渡しをちゃんと行えば違う関数内の変数の値を変えられる。 これって異なるファイル間でも同じですか? (Aというファイルで定義されたグローバル変数やポインタがBというファイル内でも使えるのかどうか) よろしくお願いします

  • javascriptのレキシカルスコープについて

    JSのレキシカルスコープがわかりません。 JSだと、一番外側のスコープで var str = "一番外側のスコープ"; とすると それ以降、ユーザー定義関数の中の、いわゆる関数スコープ内でも var str; と関数内で再定義しない限り、str = "一番外側のスコープ";を つかいまわすことになりますよね? 一度、関数内で、値を変更すると親スコープでもその変更が生きたままになると思います。 var str ="一番外側のスコープ"; function test(){ alert(str); str ="値の変更"; } alert(str) // 関数内で値をかえたけど、それが親スコープにも反映されてしまう。 このことがレキシカルスコープでしょうか? ただ、どこかのサイトで var num = 100; function makefunc() { return function() { alert(num); } } function callfunc() { var num = 50; var func = makefunc(); func(); }; callfunc(); でmakefunc()関数を呼び出した際の 関数内のnumという変数の値が100になるというのです。 実際、実行するとその通りなのですが、 var num = 50; という宣言は、callfunc() という関数の関数スコープ(ローカルスコープ) というのは理解しています。 でその中のいわゆる内部関数というのでしょうか? var func = makefunc(); func(); を実行した際の 変数numというスコープが 一番最初に宣言した  var num = 100; という値をさすというのです。(※そのサイトではこれをレキシカルスコープと呼んでいました) いったどういう動作がレキシカルスコープなのでしょうか? 他にも、クロージャともごっちゃになっております。 識者の方ご教授ください。 参考元はここです http://garden-place.jp/tech/javascript/scope-chain.html

  • javascriptのreturnがわからない

    javascriptのreturnとは? return、あるいは返すという概念がよくわからず困っています。 教えてgooの、下のURLより、 返すというのが、「借りていたものを返す」ではなく、 「リクエストされた質問に対し返答する」という意味での「返す」であることであり、 プログラミングでは、expression(=処理?)の結果を返すことだという理解をしています。 http://okwave.jp/qa/q2574681.html しかし、返された処理結果は、どこに返されるのでしょうか? 下のコードを例に私なりの解釈をします。 function menseki(r){ var m = 3.14 * r * r; return m; } var m = menseki(5); http://www.ajaxtower.jp/js/function/index4.htmlより javascriptの下のコードでは、ルーチンにたいして、サブルーチン(=function menseki)があり、 変数mは、関数内に有るため、スコープがローカル(=変数内)にあります。(あってますか?) このままだと、変数mは、サブルーチンの処理が終わった後、メモリから「mは3.14*r*rだよ」という情報が消されてしま宇野だともいます。 (javascriptはgarbage collectorがあり、また関数内の変数はローカルなので、関数内でしか使えないため。) でも、この変数mを、中身(=3.14*r*r)を維持したまま、関数外で使いたいときに、 変数mのreturnをすることで、メモリに 「mは3.14*r*r。 呼び出し元は、一番上のルーチンだから、実質的にはグローバル変数になります。」 とおしえてることでしょうか? また、呼び出し元は何を基準に決定されるのでしょうか?

  • 本文ではなく、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(){   },

  • スコープ演算子について

    php素人です スコープ演算子についておしえてください 質問1 スコープ演算子を使えばclass内の変数を下記のような書き方で取得できますか? 質問2 スコープ演算子を使うとアロー演算子でオブジェクトを作成するよりプログラムの負荷の軽減になるのですか? 質問3 アロー演算子を使わずにスコープ演算子を使ったほうがいいのでしょうか? 質問4 スコープ演算子のデメリットはありますか? class Message { public $number=1; function hello() { return "こんにちは"; } } $number = Message::$number; $message1 = Message::hello(); よろしくお願いします

    • ベストアンサー
    • PHP
  • 【VBScript】変数のスコープ

    変数のスコープについて詳しく教えて下さい。 どこで宣言すれば、どこまで有効か知りたい。 条件分岐やループ、ファンクション等でのスコープが分かりません。 特に、ファンクションの中のファンクションとかです。 参考サイトやヒントだけでも良いので教えて下さい。

  • 即時関数でプライベート変数的になってる理由を教えて

    即時関数内で、プライベート変数的な動きになっている(?)コードがあるのですが、呼び出せない理由を教えてください ・呼び出せる例1 (function() {  hoge2 = 'ホゲ2'; })() console.log(hoge2); ・呼び出せる例2 (function() {  var hoge1 = {};  hoge2 = 'ホゲ2'; })() console.log(hoge2); ・呼び出せない例 (function() {  var hoge1 = {},hoge2 = 'ホゲ2'; })() console.log(hoge2); ■質問1 ・どうして呼び出せないのでしょうか? ・varでローカル宣言(?)してるhoge1オブジェクトに紐づいているから? ・つまり、hoge2オブジェクトを生成している場所が違う? ■質問2 ・呼び出せない状態の時、hoge2はプライベート変数になっているのでしょうか? ■質問3 ・そもそもどうして呼び出せるのでしょうか? ・即時関数は(名前もしくはスコープ)空間を作り閉じ込めるので~、という記述を、どこかで見かけたような気もするのですが…

専門家に質問してみよう