JavaScriptクロージャを完全理解!スコープチェインを知る(後編)

白石俊平(あゆた)
2008-08-01 20:30:00
  • このエントリーをはてなブックマークに追加

 前回はスコープチェインのお話に入るための予備知識として「変数オブジェクト」についてのお話をしました。それを踏まえて、今回はスコープチェインと、それによって実現されているクロージャについてしっかり学んでいきたいと思います。

スコープチェインとは

 変数オブジェクトに関する説明はしっかりご理解頂けましたでしょうか?JavaScriptの変数は、全て変数オブジェクトのプロパティとして扱われている事、そして変数オブジェクトは状況に応じて違うものが使われる(グローバルスコープであればグローバルオブジェクト、ローカルスコープであれば目に見えない変数オブジェクト)というものでした。ローカルスコープに対応する変数オブジェクトは「アクティベーションオブジェクト」と呼ばれ、関数呼び出しが行われると自動的に作成されます。

 しかし実際は、変数を参照するという事は、その場における変数オブジェクト「だけ」を探す訳ではありません。例えば、以下のコードを見てください。関数の中からグローバル変数を参照する事が出来ていますね?

var a = 0;
function f() {
  alert(a);
}
f(); // 0が表示される

 f()の中から「a」という変数を参照し、値を表示する事が出来ています。しかし、f()のアクティベーションオブジェクト内には、「a」に対応する変数は存在しないはずですね。aは、関数の外で宣言されているので、グローバルオブジェクトの中に格納されているはずです。

 つまり変数「a」は次のように探し出されたという事です。まずf()における変数オブジェクトの中から、「a」に対応する変数を探しますが、見つかりません。そこで、その外側にあるグローバルオブジェクトも探す対象となり、そこでaが見つけ出されたという訳です。

 このように、変数オブジェクトを外側に向かって次々とたぐり、参照された変数を探していくという仕組みが「スコープチェイン」と呼ばれるものです。「チェイン」とは「連鎖」という意味ですので、用語の意味がこれでご理解頂けたのではないでしょうか。

 いい換えるとスコープチェインとは、「変数の参照を解決するためにたどられる、変数オブジェクトのリスト」の事だといえます。

 これで、ようやくクロージャを完全に理解する準備ができました。早速次ページから解説していきます。

  • コメント(7件)
#1 uchima   2008-12-22 17:44:30
とても良いシリーズなのに、ここで終わってしまうのは残念で仕方ありません。ぜひとも最後までお願いします。
#2 anonymous   2009-03-21 18:24:50
わかりやすく、ためになりました。
ありがとうございました。
#3 anonymous   2009-04-30 19:36:45
変数のスコープと合わせて勉強になりました
いままで曖昧だったのですっきりです
#4 anonymous   2009-06-17 17:55:26
痒い部分や、今までどういう風に動作していたか等が理解できてとてもためになりました。
今後の執筆活動も期待しております。
ありがとうございました。
#5 anonymous   2010-10-15 16:36:23
大変役に立ちました。
#6 シロクマ。   2011-12-20 15:34:07
javascriptってすごく柔軟性のある言語なんですね。
rubyも柔軟ですが、それに匹敵しそうですね。
#7 c.c.   2015-10-27 19:18:46
JavaScriptはとても柔軟で書き方が多彩なので勉強していて面白いです
  • 新着記事
  • 特集
  • ブログ