即時関数内で、プライベート変数的な動きになっている(?)コードがあるのですが、呼び出せない理由を教えてください
・呼び出せる例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
・そもそもどうして呼び出せるのでしょうか?
・即時関数は(名前もしくはスコープ)空間を作り閉じ込めるので~、という記述を、どこかで見かけたような気もするのですが…
No.1ベストアンサー
- 回答日時:
> ・どうして呼び出せないのでしょうか?
functionの中にconsole.logを入れてみれば分かりますが
関数は呼び出せています。
hoge2が(関数の外では)未宣言なのでconsole.log(hoge2);が失敗しているだけです。
> ・呼び出せない状態の時、hoge2はプライベート変数になっているのでしょうか?
関数内でvarで変数宣言した場合は、
その変数のスコープは関数内になります。
varを付けなかった場合はグローバルスコープになります。
以下がvar有りと無しの違いを端的に示す例です。
(変数スコープの問題なので、即時呼び出しするかどうかは関係ないです。)
====================================================
function a (){
var hoge1 = "aaa"; //ローカル変数:スコープは関数a
}
function b (){
hoge2 = "bbb"; //グローバル変数:スコープはグローバル
}
console.log(typeof(hoge1)); //--> undefined
console.log(typeof(hoge2)); //--> undefined
a();
b();
console.log(typeof(hoge1)); //--> undefined
console.log(typeof(hoge2)); //--> string
====================================================
この var を付け忘れるとグローバル変数を作ってしまうという仕様は
意図せずグローバル変数を作ってしまうミスに繋がるので気をつける必要があります。
この回答への補足
回答ありがとうございました。
下記では、hoge2も var対象になるのでしょうか?
var hoge1 = "aaa",hoge2 = "bbb";
No.3
- 回答日時:
ああ、ごめんなさい。
既に質問者さんは気づいておられますね。
補足ありがとうございます
・回答いただいた内容のおかげで、勘違いに気が付くことが出来ました
・下手したらずっと勘違いしたままの可能性もあったわけで、大変勉強になりましたー
No.2
- 回答日時:
var hoge1 = {},hoge2 = 'ホゲ2';
では、function() 関数スコープ内で、
var hoge1 = {};
var hoge2 = 'ホゲ2';
という処理を行う意味合いになってしまいます。そういう事を質問しているのでは無いですか?
ローカルなスコープで hoge2 を宣言してその変数の中に値を入れているので、当然ローカルな変数に入れられ、スコープから外れた場所で参照しても繋がりません。
console.log(hoge2);
で参照している hoge2 は、何処にあるのか、その辺は、調べれば解ることだと思います。
恐らくちょっと勘違いが発生しているだけかと思います。
まあ、気持ちはわかります。
回答ありがとうございました
>var hoge1 = {},hoge2 = 'ホゲ2';
>では、function() 関数スコープ内で、
>var hoge1 = {};
>var hoge2 = 'ホゲ2'
・var 宣言って、そういう意味なんですね
・hoge2はグローバルだと思ってました……
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CAD・DTP HO CADの活用について 1 2023/07/19 16:31
- 工学 以前、線形代数からフーリエ級数展開を導く上で 式v=(v, e1)e1+(v, e2)e2+…+(v 6 2022/06/29 17:24
- 工学 ちなみになぜv=(v・e1)e1+(v・e2)e2はe1やe2が、正規直交基底でないと成り立たないと 2 2022/12/22 17:22
- JavaScript javascriptで変数を組み込みたい 2 2023/01/13 09:52
- 数学 「(((a0)/2)・1, 1) …(a0)/2の1倍と1の内積 =(a0)(1, 1) …1 と1 5 2022/07/05 19:11
- Excel(エクセル) 条件付き書式の色付きセルのカウント方法について 2 2022/10/21 14:51
- 物理学 波の合成についてです E1(z,t)=A0cos(kz-ωt+Φ) E2(z,t)=A0cos(kz 1 2022/10/10 06:35
- 化学 振動数条件と量子条件の説明なんですが、こんな感じでいいですか? 振動数条件: 式E2-E1=hν 内 2 2023/04/12 08:50
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Excel(エクセル) エクセルについて教えてください。 1 2023/03/03 08:38
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
functionから別のfunctionを実...
-
関数でy=g(x)のgとは何の略です...
-
jQueryで指定された要素のIDに...
-
jQueryが読み込めない
-
jqueryの変数を関数の外に出す方法
-
R言語
-
jQuery1.4.2、jQueryUI1.8.4、t...
-
javascript(jQuery)でセル内...
-
idを使わずにonclickで自身の要...
-
静的自動補完への道
-
jQueryの :not() .not() が有効...
-
jslintのエラーについて質問
-
google apps scriptの終了のさせ方
-
Boolean型配列中のTrueの有無を...
-
同じIDで定義した要素の配列を...
-
文字を一文字ずつ表示
-
C#OpenCv V4にのエラーに関する...
-
XMLでのAttributeを持ったNode...
-
1日1回引けるJavaScriptおみく...
-
<a>タグのテキストを取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
functionから別のfunctionを実...
-
idを使わずにonclickで自身の要...
-
関数でy=g(x)のgとは何の略です...
-
phpでの文字の点滅表示
-
JAVAスクリプトで指定時間以降...
-
jslintのエラーについて質問
-
ページ内に複数表がある場合のT...
-
XMLHttpRequestでキャッシュを...
-
関数名をテキストから読み込む...
-
jQueryでzipを解凍読み込みする...
-
getElementByIdを使用したグロ...
-
jQuery 同じ処理を関数にまとめ...
-
クリックすると上に開くアコー...
-
小数点以下を5刻みで表示
-
Javascriptで引数の参照渡しか...
-
jQueryの"return false"の役割...
-
javascript(jQuery)でセル内...
-
jQueryの :not() .not() が有効...
-
jqueryの変数を関数の外に出す方法
-
jquery 複数のメソッド
おすすめ情報