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

白石俊平(あゆた)
2008-05-23 18:00:00
  • このエントリーをはてなブックマークに追加
  1. 関数本体の外で、変数宣言を行う。
  2. プログラムのいずれかの箇所で、varキーワードをつけずに変数宣言を行う

 以下で使用されている変数、i、j、kは全てグローバル変数です。

i = "global";
var j = "global";

function func() {
  k = "global";
  var l = "local"; // ローカル変数
}

 また、上のコードには実はもう一つグローバル変数が含まれています。それは何でしょう?

 答えは……

 "func"です。関数宣言は、実は以下のようなコードと等価だというのは連載の第三回で学びましたね。

var func = function() {
  ...
};

 さて、グローバル変数の宣言方法の二番目(varキーワードをつけずに変数宣言する。サンプル中では変数"k")ですが、わかりづらいので利用を控えた方が賢明です。特定の関数(ここではfunc())を呼び出したか否かによって、グローバル変数が宣言されているかどうかが変化する、というのは非常にわかりにくい動作です。

 いっそのことこの宣言方法のことは忘れてしまって、「変数宣言は常にvarキーワードを用いて行う」位の気持ちでいた方が、バグの少ないプログラムに繋がると思います。

ちょっとマニアックなTIPS:関数内のスコープは一つだけ!

 あと、スコープに関してもう少しマニアックな話題を補足しておきましょう。まず一つ目は、「ブロックスコープ」が存在しないということです。

 C/C++やJavaをご存知の方は、「中括弧を用いてスコープを定義できる」のが普通であり、これを「ブロックスコープ」と呼びます。単純に中括弧を用いてスコープを細かく区切ったり、if文やforループに続く中括弧の中で宣言した変数には、ブロックの外からアクセスできないというものです。

 では、JavaScriptでブロックスコープを使用した(ように見える)次のサンプルコードを見てください。

  • コメント(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などの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]