HOME -> プログラム -> JavaScript -> JavaScript Standard -> JavaScript-3 スコープ

JavaScript-3 スコープ

 オブジェクトに行く前にスコープについて理解を深めておきたいと思います。 他のスクリプト言語と同じくJavaScriptにも変数のスコープがあります。 グローバルとローカルスコープですが、 ここはちゃんと理解しておかなくてはいけないところです。
 以下のコードを見てみます。
var $a = 1;
var $b = 2;
function f(){
	$a += 4;
	var $b = 3;
	alert($a);
	alert($b);
}
f();
alert($a);
alert($b);
 関数 f()内にて二つの変数へのアクセスを行おうとしています。それぞれ$aに5を、$bに3を表示します。 関数内にて表示前に$aには4を加算して、$bには3を挿入しています。 $bは挿入されたので当然ですが、$aでは関数外の$aに対して加算を行い5となっています。 では、関数を出た際にどうなっているかというと、$aは関数内で挿入された値を引き継ぎ、 一方$bは2が表示され、関数内の同名変数$bと関係がないことが伺えます。

 少々難しい言葉になりますが、JavaScriptはプロトタイプベースオブジェクト指向のスクリプトです。 変数はハッシュという形でオブジェクトに格納されているといえます。 ハッシュは連想配列です。 添え字部分が変数名で、値部分が変数に格納された値になります。 JavaScriptでは該当のオブジェクトに値がない場合は自動で参照元のオブジェクトの値を検索します。 これをプロトタイプチェーンといいます。 少々理解が難しい概念ですが、ここは肝となる部分ですので頑張って理解しましょう。

 関数内で宣言された変数は関数オブジェクトに割り当てられたハッシュと言い換えることができます。 上記のコードでは$bは関数内で varを使って宣言されているので関数内で $b = 3 が挿入され、関数外では 外で宣言された var $b = 2; が評価されます。
 では関数内で $a += 4; としたこの $a はどこから来たのでしょうか? 関数内では宣言されていない変数なので、Scriptは関数オブジェクトの親を見に行きます。 ここではグローバルにあたる var $a = 1; が参照され、1が格納された $aに4が加算され5になるという結果となります。 このため関数外に出ても$aに5が継続されて格納されるという事になります。

 この、現オブジェクトに変数が無ければ親に求めるという連鎖の構造はあらゆる場面で利用されるので記憶に留めておくとよいかと思います。


2008年 10月 30日ドキュメント作成
2008年 10月 30日ドキュメント更新