プロが教えるわが家の防犯対策術!

即時関数内で、プライベート変数的な動きになっている(?)コードがあるのですが、呼び出せない理由を教えてください

・呼び出せる例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
・そもそもどうして呼び出せるのでしょうか?
・即時関数は(名前もしくはスコープ)空間を作り閉じ込めるので~、という記述を、どこかで見かけたような気もするのですが…

A 回答 (3件)

> ・どうして呼び出せないのでしょうか?


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";

補足日時:2013/11/17 11:58
    • good
    • 0

ああ、ごめんなさい。


既に質問者さんは気づいておられますね。
    • good
    • 0
この回答へのお礼

補足ありがとうございます

・回答いただいた内容のおかげで、勘違いに気が付くことが出来ました
・下手したらずっと勘違いしたままの可能性もあったわけで、大変勉強になりましたー

お礼日時:2013/11/18 21:13

var hoge1 = {},hoge2 = 'ホゲ2';



では、function() 関数スコープ内で、

var hoge1 = {};
var hoge2 = 'ホゲ2';

という処理を行う意味合いになってしまいます。そういう事を質問しているのでは無いですか?

ローカルなスコープで hoge2 を宣言してその変数の中に値を入れているので、当然ローカルな変数に入れられ、スコープから外れた場所で参照しても繋がりません。

console.log(hoge2);

で参照している hoge2 は、何処にあるのか、その辺は、調べれば解ることだと思います。
恐らくちょっと勘違いが発生しているだけかと思います。
まあ、気持ちはわかります。
    • good
    • 0
この回答へのお礼

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

>var hoge1 = {},hoge2 = 'ホゲ2';

>では、function() 関数スコープ内で、

>var hoge1 = {};
>var hoge2 = 'ホゲ2'


・var 宣言って、そういう意味なんですね
・hoge2はグローバルだと思ってました……

お礼日時:2013/11/18 21:07

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