JavaSctiptでのグローバル変数の宣言の仕方は2種類ある。
- 関数本体の外で、変数宣言を行う。
- プログラムのいずれかの箇所で、varキーワードをつけずに変数宣言を行う
i = "global"; var j = "global"; function func() { k = "global"; var l = "local"; // ローカル変数 }
上のようなコードの場合、グローバル変数は、
i, j, k, funcの4つ。
funcは、以下のコードと同等
var func = function() { ... };
関数内のスコープは一つだけ!
関数内のローカル変数は、全て関数の先頭で宣言されたことになる
function test() { for (var i = 0; i < 10; i++) { // ブロック内でjを宣言 var j = i; } // ブロックの外だが、jにはアクセスできる alert(j); }
なので、以下のコードの関数fを実行すると、undefinedになる(if文の中で、vがローカル変数として宣言されているため)。
var v = "global"; function f() { alert(v); if (!v) { var v = "local"; } }
2.JavaScriptクロージャを完全理解!スコープチェインを知る(前編)からの抜粋
結論からいうと、JavaScriptにおける変数の宣言と参照とは、
「変数名をキー、変数値を値とした、ハッシュテーブルへの読み書き」である。
ハッシュテーブルとは、文字列をキーとして値を取り出せるデータ構造の事。
そして、JavaScriptのオブジェクトはハッシュテーブルと同等。
変数を宣言すると、変数名をキー、undefinedを値とするエントリが
ハッシュテーブル内に作られる。
変数に値を代入すると、ハッシュテーブル内の値が書き換わる。
以下の図における処理では、JavaScript実行環境の内部では、
目に見えないハッシュテーブルへの読み書きとして扱われる。
このハッシュテーブルの事を、正式には変数オブジェクト(Variable Object)と呼ぶ。
変数オブジェクトは場合に応じて変わる。
例えば、関数宣言の外側、<script>タグの直下で変数を宣言した場合は、
変数オブジェクトはグローバルオブジェクトと同じになります(windowオブジェクトになる)。
<script type="text/javascript"> var a = 100; // 変数aを初期化 alert(window["a"]); // windowのプロパティを参照。100が表示される window.a = 200; // windowのプロパティを変更 alert(a); // 変数aの値が200に変更されている </script>
3.JavaScriptクロージャを完全理解!スコープチェインを知る(後編)からの抜粋
スコープチェインとは
実際は変数を参照するという事は、
その場における変数オブジェクト「だけ」を探す訳ではありません。
var a = 0; function f() { alert(a); } f(); // 0が表示される
f()の中から「a」という変数を参照し、値を表示する事が出来ています。
しかし、f()のアクティベーションオブジェクト内には、「a」に対応する変数は存在しないはずですね。
つまり変数「a」は次のように探し出されたという事です。
まずf()における変数オブジェクトの中から、
「a」に対応する変数を探しますが、見つかりません。
そこで、その外側にあるグローバルオブジェクトも探す対象となり、
そこでaが見つけ出されたという訳です。
このように、変数オブジェクトを外側に向かって次々とたぐり、
参照された変数を探していくという仕組みがスコープチェインと呼ばれるものです。
クロージャとは
クロージャとは、
「関数自身が定義された環境を、ローカル変数も含めて持ち運ぶことのできる仕組み (またはそうした関数自体) 」
の事をいいます。
以下コード例。
function createCounter() { var n = 0; // クロージャを作成して返す return function() { return n++; }; } // createCounter()を呼び出し、 // 戻り値 (関数オブジェクト) を変数に格納しておく var counter = createCounter(); alert(counter()); // 0が表示される alert(counter()); // 1が表示される ...
このようにクロージャは、
「関数呼び出しが終わってもローカル変数を参照し続けられる」
という驚くべき特徴を持っています。
この例では、戻り値となる関数が作成された瞬間に、
変数オブジェクトの連鎖(スコープチェイン)が作成されます。
そのチェインの中には、makeClosure()の変数オブジェクトも含まれており、
ローカル変数vが格納されています。
以上。
その他のシリーズは以下
JavaScriptのイロハ
0 件のコメント:
コメントを投稿