昼間のメモ

お仕事をしているときに、あっ!と思いついたことはすぐに忘れてしまいますので、とにかく残すためのメモです。

JavaScriptの変数のスコープ

2007-08-06 10:23:49 | Weblog

匿名関数を使ってスコープを限定することが分かって思いついたのが、

if (true) {
  //何かいろいろ
}

とすればいいのでは?

ということで試してみる。

if (true) {
  var msg = 'zzz';
  alert(msg);
}
alert(msg);

↑を実行すると、1回目にzzzが表示されるのは当然ですが、2回目もzzzが表示されます。つまり、if文のブレスの中はローカルスコープにならないらしい。

・・・

そこで、次のようにしてみた。

if (false) {
  var msg = 'zzz';
  alert(msg);
} else {
  alert(msg);
}

↑を実行すると、undefinedが表示されます。if文はfalseの判定だが、trueの中の変数宣言だけ(初期化はされない)は生きているらしい。

・・・

さらに次のようにしてみる。

alert("msg1: " + msg1);
msg1 = 'zzz';
alert("msg1: " + msg1);
if (false) {
  var msg1 = 'Ozzz';
  alert("msg1: " + msg1);
}

ぱっと見では、msg1は宣言されていないためスクリプトエラーとなりそうなのだが、結果は「undefined」、「zzz」と2回表示されます。

if (false){}内のvar msg1宣言がなければスクリプトエラーとなるが、とにかくこのスコープ内にvar宣言があれば、あたまからその変数が使える。

当初はvar宣言の後方で変数が使えると思ったが、スコープの先頭からundefinedの値として使えるみたいです。おそらくパス1で変数宣言のリストをピックアップして、パス2で実行しているような感じ。パス1はif文等の通る/通らないは関係なしにvar宣言のみを探している感じか。

で、そのスコープの単位が関数単位らしい。関数の外に出ると変数は宣言されていないことになる。

さらにvar宣言もいい加減で、同じ変数名で2回以上var宣言してもエラーとならない。

var msg1 = 'zzz';
alert("msg1: " + msg1);
var msg1 = 'zzz';
alert("msg1: " + msg1);

・・・

プロトタイプ型言語としては面白いけど、こんな言語を仕事では使いたくはないな。。。

プリプロセッサで危険なコードをチェックできればいいのかもしれんが。

ジャンル:
ウェブログ
コメント (0) |  トラックバック (0) |  この記事についてブログを書く
Messenger この記事をはてなブックマークに追加 mixiチェック シェア
« 匿名関数の定義と... | トップ | カスタムtaglibの... »

コメント

コメントはありません。

コメントを投稿


コメント利用規約に同意の上コメント投稿を行ってください。
※文字化け等の原因になりますので、顔文字の利用はお控えください。
下記数字4桁を入力し、投稿ボタンを押してください。この数字を読み取っていただくことで自動化されたプログラムによる投稿でないことを確認させていただいております。
数字4桁

トラックバック

この記事のトラックバック  Ping-URL

あわせて読む