0 Comments
 ふと思い出したのでメモがてら書いておく。

Javascript にはブロックスコープが無い。

「そもそもスコープって何?」

 っていう人にはあまり関係ないんだけど、まあいつの日か勘違いすることが有るかもしれないので、

「Javascriptにはブロックスコープが無い」

 ってのだけ覚えておきましょう。ただ、昔っから「ブロックスコープ入れようぜ」という話が出てたので「じつは最近の環境は導入されてるんじゃねーね?」と CS5.5 の ESTK で確認してみたんだけどやっぱりブロックスコープは無かったです。

 さてブロックスコープが無いということはどういうことか見てみましょう。次のソースを実行してみるとその現象が、かいま見れます。ちなみに実行環境は CS5.5 の ESTK でございます。

//グローバルなx
var x = 0;

//グローバルなxを書き換える
out_X();
$.writeln(x);

//trueだとサブルーチンでvarしたxを書き換える
out_X2(true);
$.writeln(x);

//false だとグローバルな x を書き換える。。。はず??
out_X2(false);
$.writeln(x);

function out_X(){
	//このxはグローバルだよね
 	x = 20;
 	$.writeln(x);
}

function out_X2(arg) {
	if (arg) {
		//このxはローカルだよね
		var x = 10;
		$.writeln(x);
	} else {
		//このxはグローバルじゃないの??
		x = 100;
		$.writeln(x);
	}
}


 これを実行するとコンソールに以下の内容が出力されます。

20
20
10
20
100
20


 むむ、out_X2(false) の実行結果に注目です。var を記述しているブロックを通らずに x に値を設定しているので、ここはグローバルな x に値がセットされるかと思いきや値がセットされていません。

 これが「ブロックスコープが無い」という言葉を具体的に示した例です。他の言語を触ったことがある人だと var x 記述したブロック内で x がローカル変数になる気がするのですが、Javascript の場合はブロックスコープが無いため var 宣言された変数はファンクション内で一律に参照されてしまうのです。ですので out_X2 は以下の記述と等価となります。

function out_X2(arg) {
	var x;
	if (arg) {
		x = 10;
		$.writeln(x);
	} else {
		x = 100;
		$.writeln(x);
	}
}


 まぁ、グローバル変数じたい、そんなにばりばり使ってる人もいないでしょうからあまり気にしなくても大丈夫かもしれません。ただブロックスコープが無いということは入れ子のループをする際に「外ループも内ループも変数は同じスコープになる」っていうのはまめ知識として覚えておくといいやもしれませぬ〜

ひらくん
Posted byひらくん

Comments 0

There are no comments yet.

Leave a reply