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

白石俊平(あゆた)
2008-05-23 18:00:00
  • このエントリーをはてなブックマークに追加
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に関してはは、ご存じなかった方も多いのではないでしょうか。

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

  • コメント(4件)
#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
担当の大野です。間が空いてしまっていて恐縮です。来週に掲載予定です。こうご期待!
#4 hina   2012-07-05 16:38:02
色々と謎が解けました

本当にありがとうございます。

白石俊平さんのJavaScriptの本が出てないのが残念です。
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]