JavaScriptの変数のスコープについて学ぶ

白石俊平
2008/05/23 18:00

今回と次回でJavaScriptにおける変数のスコープについて学びます。今回は、スコープについての基本的な事柄を軽く復習するとしましょう。

function test() {
   for (var i = 0; i < 10; i++) {
     // ブロック内でjを宣言
     var j = i;
   }
   // ブロックの外なので、jにはアクセスできない?
   alert(j);
}

 上のコードで、「ブロックの外なので、jにはアクセスできない?」とコメントされている部分は、実際にはアクセスできます。これは、前述した「ブロックスコープが存在しない」ということによるものです。

 さらに正確を期して言うなら、この挙動は「関数内のローカル変数は、全て関数の先頭で宣言されたことになる」というルールによるものです。このルールに則ると、上のコードは以下のように書き換えることができます。

function test() {
  // 関数の先頭でローカル変数を全て宣言
  var i, j;
  for (i = 0; i < 10; i++) {
    j = i;
  }
  alert(j);
}

 おわかりいただけましたか?これはつまり、「一つの関数は、一つのスコープとのみ対応している」と言い換えることができます(この言葉は、次回の記事への布石です)。

では以下の関数fを実行すると、どんな値がアラート表示されるでしょう?

var v = "global";
function f() {
  alert(v);
  if (!v) {
    var v = "local";
  }
}

 答えは……

 "undefined"です。if文の中で、vがローカル変数として宣言されていることに注意してください。

今回のまとめ

 今回は、今更ながら変数のスコープについてお話ししてみました。が、最後に紹介したTIPSに関してはは、ご存じなかった方も多いのではないでしょうか。

 しかし、変数のスコープに関する話題はまだ終わりではありません。次回はさらに踏み込んで、「スコープチェイン」に関するお話をしてみたいと思います。乞うご期待!

  • コメント(3件)

#1 uchima  - 2008/07/24 09:37:29

早く続きが読みたいです。せめてDojoコードを読む手前までは連載を続けてほしい。
» 不適切なコメントを報告する

#2 tomita  - 2008/07/24 16:05:05

builder編集部 冨田です。 ご要望、ありがとうございます。改めて白石俊平さんに連絡したところ、 「頑張ります。今週土日に書きま... 続きを見る
» 不適切なコメントを報告する

#3 大野晋一  - 2008/07/24 16:15:31

担当の大野です。間が空いてしまっていて恐縮です。来週に掲載予定です。こうご期待!
» 不適切なコメントを報告する
記事に関係する情報をコメントでお寄せください

ニックネーム : CNET_IDにログインしてコメントする

コメント本文(必須) :
  • 新着記事
  • 人気記事
  • 特集
  • ブログ