プロが教える店舗&オフィスのセキュリティ対策術

return 範囲内における、ローカル / グローバルスコープについて教えてください

■質問
・returnするまではローカル変数?
・returnしたらグローバル変数?
・それとも、「return の中」というスコープは存在しない?

■例1
(function(){
 return{
  //ローカルスコープ?
  //ここで定義した変数はローカル変数?
 }
})();

■例2
(function(){
 return{
  hoge : (function(){
   //ローカルスコープ?
   //ここで定義した変数はローカル変数?
  })()
  };
})();

A 回答 (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関数という名前で実際に作られていません。あくまでイメージです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました

>『変数』と、その中の『オブジェクト』は別物
・大変参考になりましたー

お礼日時:2015/02/01 09:58

>■質問


>・returnするまではローカル変数?

「ブロック内のローカル変数」であるので、ローカル変数。

>・returnしたらグローバル変数?

「関数の戻り値」は、ローカル変数でもグローバル変数でもない「(式中で揮発する)一時変数」である。

>・それとも、「return の中」というスコープは存在しない?

存在しない。

「{」と「}」で括られた部分を「ブロック」と言い、ブロック内で宣言された変数のスコープは「ブロック内」となる。

関数本体も「{」と「}」で括られた部分なので、広い意味で「ブロック」と言える。
    • good
    • 0
この回答へのお礼

回答ありがとうございました
・参考になりましたー

お礼日時:2015/02/01 09:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!