- 締切済み
return の中はローカルスコープ?
return 範囲内における、ローカル / グローバルスコープについて教えてください ■質問 ・returnするまではローカル変数? ・returnしたらグローバル変数? ・それとも、「return の中」というスコープは存在しない? ■例1 (function(){ return{ //ローカルスコープ? //ここで定義した変数はローカル変数? } })(); ■例2 (function(){ return{ hoge : (function(){ //ローカルスコープ? //ここで定義した変数はローカル変数? })() }; })();
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- nda23
- ベストアンサー率54% (777/1415)
return文で返す「値」にスコープはありません。 【例】 return a + b; この場合、aやbのスコープに関わらず、a+bという 一時的に計算した値が返りますね。この値はこの一瞬 だけしか存在しないので、呼び出し側が変数で受け 取らない限り、消滅します。 この「一瞬の値」のスコープは?という問いには 「ありません」と言う他ないですね。 尚、掲題プログラム中にある「?」は全て「はい」 です。
- byDesign
- ベストアンサー率75% (45/60)
スコープとは『変数』がどこまで参照可能かという事です。 その為、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関数という名前で実際に作られていません。あくまでイメージです。
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
>■質問 >・returnするまではローカル変数? 「ブロック内のローカル変数」であるので、ローカル変数。 >・returnしたらグローバル変数? 「関数の戻り値」は、ローカル変数でもグローバル変数でもない「(式中で揮発する)一時変数」である。 >・それとも、「return の中」というスコープは存在しない? 存在しない。 「{」と「}」で括られた部分を「ブロック」と言い、ブロック内で宣言された変数のスコープは「ブロック内」となる。 関数本体も「{」と「}」で括られた部分なので、広い意味で「ブロック」と言える。