2017/03/28

[js]グローバル変数の初期値はundefinedという値らしい

未だにJavaScriptをやっている。
あと数日のりきれば、おさらばできる(はず)。。。

 

先日、関数間をまたがる変数がほしくて、グローバル変数を使った。

  • 関数の外でvarを付けて宣言
  • 関数の中でvarを付けずに使用

のどっちからしい。
今回は連想配列をグローバル変数にしたかったので、こんなコードを書いた。

if (global_val[xxx] == null) {
  global_val[xxx] = yyy;
}

どうせ初期値はnullだろうと思ったのだ。
が、これはダメだった。

どうやら、初期値はundefinedというグローバル変数らしい。
また、undefinedという変数は代入可能なようで、==で比較するのは良くないと書かれていた。
そんなの知るか!ということで、こう変更した。

if (global_val[xxx] == undefined) {
  global_val[xxx] = yyy;
}

が・・・これもダメ。

if ((global_val == undefined) || (global_val[xxx] == undefined)) {
  global_val[xxx] = yyy;
}

たしか、こんな感じに変更してようやく動いたと思う。
やれやれ。

 

個人の感想だが、先に入れ物の有無を確認する必要があるのだったら、入れ物を初期化する処理も書くようになっていた方がわかりやすかったんじゃなかろうかと思う。

if (global_val == undefined) {
  global_val = new 連想配列作る();
}
if (global_val[xxx] == undefined) {
  global_val[xxx] = yyy;
}

この辺りは、私がJavaScriptの気持ちになりきれていないからだろう。
説明を読んで勉強しておこう。
var - JavaScript | MDN

 

困ったことに、今使っているのがmeteorというフレームワークで、これはjsファイルをincludeして関数化してしまうらしい。
だから、関数外でvarを付けて変数宣言しても、グローバル変数にはなってくれないとのこと。
いきなり関数内で知らない変数名が出てくるとあせるので、関数の外にvar無しでundefinedでも代入しておくのが良いのかなぁ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。