プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
JavaScript、変数のスコープとプチトリビア。
「var」をつけるとローカル変数、何もつけないとグローバル変数。

わざわざ書くほどのことも無いとは思うのですけどね。

ぶっちゃけJavaScriptなんてわざわざ本腰入れて勉強する程のもんでもないし
必要になったら必要になった分だけ調べれば事足りるじゃん。

とかナメナメだった私みたいな人向けに書いておきます。

大抵のプログラミング言語では普通の変数はローカル変数になります。
変数宣言が不要(省略可能)な言語でも、
最初に登場した位置を基準にローカル変数化されますよね?

ところがどっこいJavaScriptは違うのです。
何も付けずに

hoge = 1;

って書くとグローバル変数になり「var」をつけて

var hoge = 1;

と書くことで初めて関数スコープのローカル変数になるんですってさ。

へー(--)/凸

さて、これだけで終わっちゃうのもなんなのでおまけですφ(--)

ローカル変数(「var」付き変数)の宣言は関数の先頭に移動?する。

へーへーへーへーへー(--)ノミ☆凸ガンガン

使いどころも無いし意味不明っちゃ意味不明なのですが、
ローカル変数は変数宣言が先頭に移動?しちゃうようなのです。

例えばこのコードはエラーになりますφ(--)
<html>
<head>
<script type="text/javascript">
<!--
function init(){
    //「'a'は宣言されていません」のエラーになる。
    alert(a);
}
// -->
</script>
</head>
<body onload="init()"></body>
</html>

当たり前ですね。
変数aは宣言されていません。

次にこんなコードを実行してみましょうφ(--)
<html>
<head>
<script type="text/javascript">
<!--
function init(){
    //「'a'は宣言されていません」のエラーになる。
    alert(a);

    a = "aaa";
}
// -->
</script>
</head>
<body onload="init()"></body>
</html>

これもエラーになります。
当たり前ですね。
変数aの宣言&代入より「alert(a);」で使用する方が先ですから。

それでは最後にこんなコードでは如何でしょう?φ(--)
<html>
<head>
<script type="text/javascript">
<!--
function init(){
    //変数aは「undefined」になる
    alert(a);

    var a = "aaa";
}
// -->
</script>
</head>
<body onload="init()"></body>
</html>

はい、これはエラーにはならず「undefined」でalertが出ます。
ちなみに「undefined」は宣言済みで値が未設定状態の変数ね。

てことはローカル変数の宣言部分だけ
「alert(a);」の前に移動してるのかしら(--?

詳しいことは分かりませんが、
JavaScriptさんはそんな挙動をするようです。

まぁこの挙動を利用したプログラムなんて書きたくないけど。
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● JavaScript  thema:パソコンな日々 - genre:コンピュータ  Posted by ササキマコト 

  関連記事