return 範囲内における、ローカル / グローバルスコープについて教えてください
■質問
・returnするまではローカル変数?
・returnしたらグローバル変数?
・それとも、「return の中」というスコープは存在しない?
■例1
(function(){
return{
//ローカルスコープ?
//ここで定義した変数はローカル変数?
}
})();
■例2
(function(){
return{
hoge : (function(){
//ローカルスコープ?
//ここで定義した変数はローカル変数?
})()
};
})();
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が見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript JAVASCRIPT 2 2022/04/15 15:10
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- JavaScript JavaScriptの即時関数の書き方 1 2022/11/29 09:52
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
- JavaScript 正規表現について質問です。条件に合う場合はtrueを返したい 3 2022/10/06 23:02
- その他(プログラミング・Web制作) pythonのプログラムについての質問です。 1 2023/05/26 10:31
- オープンソース Coinmarketcap api 1 2022/05/30 15:47
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
URLの一部をコピーできるブック...
-
c++プログラム。どこがだめか教...
-
HTTPSのとき":"が"%3A"ではなく...
-
functionから別のfunctionを実...
-
javascriptで自動計算フォーム...
-
日本語入力の禁止
-
関数でy=g(x)のgとは何の略です...
-
google apps scriptの終了のさせ方
-
空の配列に2次元配列の追加
-
第3日曜日のみの日付を取得、...
-
HTML:Tableタグに対し、JavaScr...
-
React hooksが値を返して配列変...
-
javaScript textareaの一行あた...
-
Javascriptで引数の参照渡しか...
-
innerHTML実行後のイベント
-
ActiveXobjectが作成できない
-
リンクボタンからインラインフ...
-
別窓を開いて、ページ下部中央...
-
CDの曲をケータイのSDに移す
-
択一形式のテストをつくりたいです
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Boolean型配列中のTrueの有無を...
-
【正規表現】【javascript】CR...
-
ASP+アクセスでのSQLコメントに...
-
Linux バイナリ実行できない "...
-
Vb.netのグローバル変数の宣言...
-
ボタンをクリックすると数が増...
-
【Jquery】changeイベント毎にa...
-
正規表現で半角数字1桁のみを全...
-
「オブジェクトが必要です。」...
-
HTTPSのとき":"が"%3A"ではなく...
-
onclick指定関数の引数へローカ...
-
同じ型【ハイフンと数字】だけ...
-
Excel VBA の ChangeFileAccess
-
C# .NET DataGridView の行を追...
-
javascriptで文字挿入でtoggle...
-
ifreamをリロードしたい
-
window.onloadでのfunction
-
static constメンバ変数(配列)...
-
MFCのキャプション変更
-
アンカーリンクをクリックさせ...
おすすめ情報