0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

JavaScript初心者がハマりがちな5つの落とし穴と実践的対処法

0
Posted at

まずは環境を整える

まずは開発環境を整えることが大切です。私の場合、最初にNode.jsをインストールし、npmを使って必要なパッケージを管理しました。VS Codeをエディタに選び、拡張機能はPrettierとESLint、Chrome DevTools拡張を入れました。これらを入れたら、まずはプロジェクトフォルダを作成し、npm init -yでpackage.jsonを生成します。次に、srcフォルダを作り、index.jsを書き始めます。この段階で「npm install」だけで依存ライブラリが増えていくと、後でバージョンの依存関係が原因でエラーが出やすくなります。そこで、package-lock.jsonを必ずコミットし、CIで依存関係を固定する習慣をつけました。また、環境変数は .env に保存し、dotenvパッケージでロードする方法を覚えておくと、後々設定変更が楽です。開発環境が整っていれば、コードを書くときに「設定が違う」という原因で時間を浪費する心配が減ります。さらに、 .gitignore を作成してノード_modulesやログファイルを除外するのも忘れずに。開発フローとしては、feature ブランチで作業し、pull request を経て main にマージすることを徹底しました。このプロセスを守ることで、他のメンバーとの衝突を防ぎ、レビューの質も向上します。開発環境を整える際に、まずはエディタのインデント設定を 2 スペースに統一し、エラー表示を有効にしておくと、コードの可読性が向上し、バグの発見が速くなります。また、ターミナルで「npm run dev」や「npm run build」などのスクリプトを定義し、コマンド一発でビルドやテストを実行できるようにすると、作業効率が格段に向上します。さらに、Git のコミットメッセージを具体的に書く習慣をつけると、チームとのコミュニケーションがスムーズになり、トラブル時の原因追跡が容易になります。

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

最新ツール・トレンド情報をずんだもん×めたんが解説するYouTubeチャンネルを運営しています!
いいね、チャンネル登録してもらえると嬉しいです🙇‍♂️


ハジメル.dev: https://hajimeru-dev.vercel.app/

「ひとりで続けるのは難しい」「何から学べばいいか分からない」という方向けに、
プログラミングのマンツーマンレッスンサービス「ハジメル.dev」も運営しています。
未経験OK・オンライン完結・月額制/違約金なしなので、気軽に無料相談してみてください🙇‍♂️


海外テックニュースを追いたいけど、英語や情報量の多さで大変…という方向けに、
Hacker News の話題を日本語でサクッと追える「HackerNews 日本語まとめ & AI要約」
を個人開発しました!
技術トレンド収集に使ってもらえると嬉しいです🔥🙇‍♂️
→ HackerNews 日本語まとめ & AI要約: https://hn-matome-2ht.pages.dev/


「ニャンパイアサバイバー」というヴァンパイアサバイバーリスペクトのゲームを作成しました!
もしよろしければ遊んで頂けると嬉しいです😭


習い事教室の先生向けに、SNS 投稿・生徒募集・保護者通知の文章を AI で生成する Web サービス「おしらせAI」を個人開発しました。Next.js + Supabase + LLM で構成しており、無料で月 10 回まで試用できます。よければ触ってみてください。

→ おしらせAI: https://oshirase-ai.vercel.app/

✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨

コンソールデバッグのコツ

デバッグはコードを読むことと同じです。最初にやったことは console.log で変数の値を出力することでしたが、 rápidamente は膨大なログになり、意味が不明確になりました。そこで、 console.table を使ってオブジェクトを一覧表示したり、 console.group で関数呼び出しの入出を可視化したりしました。また、Chrome DevTools の Sources タブでブレークポイントを設定し、ステップ実行を繰り返すと、変数の変化をリアルタイムで確認できます。さらに、 console.trace を使うと、呼び出しスタックが一目で分かり、どこで問題が起きているかが分かりやすくなります。私は「デバッグは自分と対話すること」だと考えており、無駄なログは削除し、必要な情報だけを出力するように心がけました。具体的には、ループ内で大量に console.log を入れるのを避け、必要な箇所だけに絞り、最後に console.clear() で画面をリセットする習慣を持ちました。さらに、 debugger; 文をコードに入れると、デバッガが自動で停止し、変数の状態を確認しやすくなります。デバッグ中に console.time('hogehoge') と console.timeEnd('hogehoge') を使うと、特定の処理の実行時間を計測でき、ボトルネックの特定に役立ちます。また、 console.assert(condition, 'メッセージ') を使うと、条件が false のときだけメッセージが出力され、テストのように見えるデバッグが可能です。

変数・スコープの落とし穴

JavaScript では var、let、const の違いがよく causing errors になります。var は関数スコープであり、同じ関数内で何度でも再宣言できるため、意図しない再代入が起きやすくなります。特にブロックスコープを意識せずに for ループのカウンタ変数を var で宣言すると、ループの最後にカウントが残ってしまい、予期しない結果を招きます。一方、let はブロックスコープで、const は変更不可です。ただし、const でもオブジェクトや配列は内部可変なので、誤って再代入してしまうことがあります。私の失敗例としては、複数の関数で同じ変数名を var で宣言し、予期せぬ再宣言が重なることで、後から別の関数がその変数を参照すると値が上書きされ、バグが顕在化しました。これを防ぐために、できるだけ const を使い、再代入が必要な変数は let に限定し、スコープが明確になるように関数単位で変数を分離しました。また、var の使用は極力避け、let と const のみでコードを書く習慣をつけると、スコープに関するバグが減ります。さらに、var のホイスティング現象は、変数宣言が関数の先頭で行われるため、使用前に変数を参照するとundefined が返ります。この「一時死区」(Temporal Dead Zone) は let と const が原因で起こりますが、var と混同しやすく、特に初心者は「変数がundefined でエラーになる」ことに混乱します。実際に、let の変数をブロック外で参照しようとすると ReferenceError が発生し、コードの流れが止まります。この挙動を理解して、変数宣言の位置を意識することが重要です。また、クロージャを作るときに、外部変数を参照し続けると、予期しないリテンションが起き、メモリリークの原因になることがあります。その場合は、スコープを明示的に閉じるか、once だけの変数を使う工夫で回避しました。

非同期処理の基礎

JavaScript はシングルスレッドですが、setTimeout、fetch、Promise などで非同期処理を扱います。最初に学んだのはコールバック地獄です。ネストされたコールバックを書くと、インデントが深くなり、読む側にとっては非常に困難になります。これを解消するために Promise を使うようになりました。Promise.then() で次の処理を記述し、catch でエラーハンドリングを入れると、エラートラッキングが楽になります。しかし、Promise を連鎖させすぎると、可読性が低下し、エラーが隠れやすくなります。そこで async/await を導入し、コードを同期的に書く感覚で書くことで、可読性が向上します。ただし、await を使うときは必ず try/catch で例外を捕捉し、未処理の拒否 (unhandled rejection) が発生しないように注意が必要です。私の失敗例は、await の後に finally を入れ忘れて、リソース解放が漏れてしまい、データベース接続が枯渇したことです。具体的には、データ取得後、connection.release() を finally に入れるようにしたところ、問題が解消しました。また、Promise.all() を使って複数の非同期リクエストを並列に待機させるときは、すべて成功したときだけ処理を進めるようにすると、部分的な失敗で全体が止まるのを防げます。fetch を使う場合は、AbortController を利用してリクエストをキャンセルできるようにすると、ユーザーがページ遷移したときに未完了の通信が残るのを防げます。また、Promise.race() を使うと、最も早く完了した非同期タスクの結果だけを取得でき、タイムアウトや最速レスポンスの取得に便利です。非同期処理の設計では、エラーハンドリングを統一し、catch で統一的にエラーメッセージを出力するようにすると、デバッグが楽になります。

まとめ

今回紹介した5つのポイントを振り返ると、まずは開発環境を整えることが根本的に重要です。整った環境でコードを書くことで、設定ミスや依存関係の問題を未然に防げます。次に、コンソールデバッグを活用し、情報を可視化する習慣を持つと、エラー原因の切り分けが格段に楽になります。変数・スコープの落とし穴については、let と const の使い分け、スコープの意識、ホイスティングと一時死区を理解することで、予期せぬバグを減らすことができます。非同期処理はコールバックから Promise、そして async/await へと進化させ、エラーハンドリングとリソース解放を忘れずに行うことが大切です。これらを意識して実践すれば、初心者でもエラーに悩まされず、スムーズにコードを書けるようになります。ぜひ、今日から「環境整備」「デバッグ」「変数管理」「非同期」の四つの柱を意識して、少し先を歩くエンジニアのように成長してみてください。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?