JavaScript

JavaScriptでは「変数のスコープ」を正しく理解してエラーを減らそう!

scope

変数の「スコープ」は正しく理解しないと、エラーにならないエラーが起きて相当こまることになっちゃいます。
実際、デバッグしてエラーはないのに期待している効果が得られず、原因を見つけるのに予想以上に時間を消費してしまったことがあるんです。

そんなわけでおさらい。

JavaScriptのスコープは大きく分けて2つです。

  1. グローバルスコープ
  2. その名の通り関数の外、トップレベルコードのスコープです。
    これは分かりやすいですね。
    関数の外で変数を宣言しておけば、どこでも使えちゃうってわけです。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    //グローバル変数
    var x = 0;
     
    function f(){
        x = 2;
        print(x);
    }
     
    function f2(){
        print(x);
        x = 3;
        print(x);
    }

    結果はこんな感じ。

    1
    2
    3
    
    2
    2
    3
  3. 関数スコープ(ローカルスコープ)
  4. こちらも名前の通り関数の中で宣言した変数ですね。
    注意点は、関数内の変数は宣言した行とは関係なく、その関数内で有効ってこと。
    だから関数内の変数は関数の冒頭にまとめておくようにしています。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    function f(){
        //関数変数
        var x = 2;
        print(x);
    }
     
    function f2(){
        //関数変数
        print(x);
        //関数変数
        var x = 3;
        print(x);
    }

    結果はこんな感じ。

    1
    2
    3
    
    2
    undefined
    3

注意点として、ブロックスコープはありません。
例えば、以下。

1
2
3
4
5
6
7
8
9
10
11
//グローバル変数
var X = 5;
 
//ブロックスコープを期待してこう書く
{
var X = 3; 
print(x);
}
 
//これに5が入ってることを期待すると間違う
print(x);

結果はどちらも3が入ってます。

1
2
3
3

ブロックスコープがないので、
実際はグローバル変数を使い回しているんです。

実はJavaScriptの独自拡張にブロックスコープが使える「let」というのがあるらしいのですが、私は使っていません。なんかややこしくなりそうで^^;

もうひとつオマケ。
JavaScriptの関数は入れ子に宣言できます。
そのとき、内側の関数内で参照している変数が見つからなければ、
そのひとつ外側の関数に向かって変数名を探しにいきます♪
でもって、最終的にグローバル変数を参照することになりますね〜。

関連記事

  1. tweenmax_license01.jpg

    JavaScript

    「TweenMax.js」をビジネス利用のためのライセンス購入方法

    いつもJavaScriptのアニメーション部分でお世話になってる「…

  2. fb022d1ac056d555673c17937de7f431.png

    JavaScript

    強力なアニメーション用のJavaScriptライブラリー「TweenMax.js」が便利!

    jQueryでもアニメーションはできるのですが、それよりも表現力豊…

  3. js_comment.jpg

    JavaScript

    JavaScriptでコメントは「/* */」をなるべく使わないようにしたい

    コメントには囲った部分をすべてコメントにする「/* */」と、1…

  4. trycatch.jpg

    JavaScript

    JavaScriptでエラーが起っても固まらないように「try-catch」する

    HTML5とJavaScriptでこねこねしてWebアプリを作って…

  5. data_access.jpg

    JavaScript

    JavaScriptでグローバル変数の使いどころを見直してパフォーマンスを改善する

    JavaScriptのコードの中では、どこにデータを格納するかでコ…

  6. QueryString.jpg

    JavaScript

    クエリーストリングを利用してWebページ間でデータを受け渡してみる

    「クエリーストリング」っていうのは以下のようなGoogleで検索し…

アーカイブ

  1. Milk_teeth_case-1.jpg

    日常

    抜歯のときにもらったケースがかわいらしい件。どうやら「乳歯ケース」というらしい
  2. 日常

    ステイ先決定
  3. 【IKEA】ダウン&フェザーの枕「JORDRÖK(ヨールドローク)」のかためを買ってみた

    IKEA

    【IKEA】ダウン&フェザーの枕「JORDRÖK(ヨールドローク)」のかためを買…
  4. wordpress_Fatal_error.jpg

    WordPress

    新テーマを適用したらでる「Fatal error」はWordPressのアップデ…
  5. レゴ・ガチャ「スター・ウォーズ」全5種

    LEGO

    レゴ・ガチャ「スター・ウォーズ」全5種
PAGE TOP