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の本が出てないのが残念です。
本当にありがとうございます。
白石俊平さんのJavaScriptの本が出てないのが残念です。
folllow builer on
twitter
- 新着記事
- 特集
- ブログ
- 企画特集
-
その先へ
-
未来のセキュリティイノベーターへ
-
明日からではもう遅い?!
-
次の一手はこれだ!
-
M365 活用のセキュリティ対策
-
SECCON2020レポート第二弾!
-
部分最適だけではダメ
-
ビッグデータ最前線!
-
デジタルを当たり前と言えるか?
-
データの散在と非常率運用がネック
-
第4回CNBFミートアップレポート
-
ネットワークもサービスとして使う
-
いまさら聞けない「PPAP」
-
企業のリスクマネージメント対策に
-
ゼロトラストに向けた道のりを支援
-
リモート、オフィス、オンサイト
-
セキュリティの今を知る
-
クラウド時代に理想のセキュリティ
-
厳しい目が向けられる内部不正
-
SoRとSoEをつなぐDX推進の要
-
IDaaSって何?
-
次期自治体ネットワーク強靭化へ
-
コスト・運用の壁を崩す!
-
DX時代のアプリケーションセキュリティ
-
連載!プロが語るストレージ戦略
-
ハイブリッドクラウドとAI
-
連載!プロが語るストレージ戦略
-
いまあるデータで身近な業務をDX
-
漫画で解説:IoTはじめの一歩
-
性能の大幅向上を実現!
-
連載!プロが語るストレージ戦略
-
特集:IT最適化への道
-
クラウド活用 虎の巻