JavaScriptの変数のスコープについて学ぶ
白石俊平(あゆた)
2008-05-23 18:00: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
担当の大野です。間が空いてしまっていて恐縮です。来週に掲載予定です。こうご期待!
- ホワイトペーパー



