Java出身者が書いたJavaScriptにありがちな誤解を正していきたい

Javaが大好きなイット企業のSE戦士が、毎日遅くまで残業させられて
自社製品の知識や業務知識の習得に時間が割かれてしまい、技術的な基礎知識を習得できずクソコードが量産されてしまう。

Javaはなんだかんだで重要視されていて新人の頃から研修メニューに組み込まれるけれどもイット企業の認識でJavaScriptはJavaのおまけの簡単言語みたいな位置づけになってしまっている。

それにもかかわらず企業向けのWEBアプリはデザイナに発注することも出来ず下請けのエスイー様が昔ながらのテーブルレイアウトで画面を作ることになる。

もっともクソコードが隠れているのがここHTMLとJavaScriptだ。

JavaScriptにクラスはねー。jsファイルはクラスじゃねー

JavaScriptにクラスはない。
いやいや今日は「クラスベースのオブジェクト指向ではなく、プロトタイプベースなのだ」とかいう話はしない。

僕が言いたいのは、jsファイルはJavaのクラスのような一つの単位にならない。

だから別のjsファイル内に同名の関数や変数があったら、後から読み込まれた方に上書きされてしまう。
だから何個も何個もjsファイルを読み込んでいて、それぞれの関数が適当な簡単な名前をつけていたらそのうち衝突をするぞ。

jsファイル内でJavaのフィールドのような真似をするなー

さっきの話に通じているけれど、JavaScriptにクラスはない。
名前空間もない。
単純に「関数の中か外か」の違いしか無い。

別の関数と共通の変数を使いたかったり、データ保持用の変数をフィールドに持たせたりすることをよくJavaではやるけれど、
JavaScriptで同じように関数外に書くとグローバル領域に書いたことにある。
そうせざるを得ない場面もあるだろうが、グローバルという意識なしにflgとかnumとか簡単な変数名にして関数外に書き入れる人がいるが、それ絶対どこかであとで衝突する。

なるべく関数の中に収めるように書くことが必要だ。

もし一回こっきり呼び出される関数があるのならば、無名関数にするとかjQueryで$();のなかに書くようにすれば
スコープは関数内で限定されるし、
関数呼び出し後にもデータを保持したいのならばクロージャなどを使えばいい。

また、複数の関連する関数を一つのオブジェクトにまとめておけばグローバルも不用意に汚すことも無い。

グローバルに変数を不用意においたり、衝突する可能性を考えずに関数をズラズラ増やし続けないでほしい。

varはただの飾りじゃない

JavaScriptでは変数を宣言するときに型を指定しない代わりにvarをつける。
でも「付けなくても動くから、付けても付けなくてもいいや」程度の人がいるが、
var無し変数はグローバル変数だ。
関数内で宣言しても何処かで衝突したらぶっ殺されるし、バグ追いかけづらくなる。

特にif(i = 0 i < a.length ; i++) とかfor文を宣言したあと、
その中で別の関数を呼び出した場合はどうだ。

その後呼び出された関数の中でfor分が使われていたらfor文が正しく回らなかったり無限ループに陥る。

 

 

とりあえず初歩的だけれどもここらへんを抑えておけば最低でもクソで早急にもリファクタリングが必要なコードは抑えられると思う。

スポンサードリンク

関連コンテンツ