• 締切済み

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

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

みんなの回答

  • 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関数という名前で実際に作られていません。あくまでイメージです。

回答No.1

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

関連するQ&A