キッズプレート、パスタおかわり

プログラミングやデジモノについてあれこれ
--.--.-- --:--|カテゴリ:スポンサー広告| コメント(-)

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2012.08.16 01:39|カテゴリ:Javascriptコメント(0)

[Javascript] にはブロックスコープが無いんだよ


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

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);
	}
}


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

コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

ひらくん Author:ひらくん
どもども、ひらんくんどす。
日々まったり過ごしております。
仕事はDTP関連のスプリクト&アプリケーション開発。
Follow happyscript on Twitter

ブログ内検索



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。