JavaScript をデバッグする

Kayce Basques
Kayce Basques
Sofia Emelianova
Sofia Emelianova

このチュートリアルでは、DevTools で JavaScript の問題をデバッグするための基本的なワークフローを説明します。以下を読み進めるか、このチュートリアルの動画版をご覧ください。

バグを再現する

バグを常に再現できる一連の操作を見つけることは、デバッグを行う際の最初のステップです。

  1. 新しいタブで こちらのデモを開きます。
  2. [番号 1] ボックスに「5」と入力します。
  3. [番号 2] ボックスに「1」と入力します。
  4. [Add Number 1 and Number 2] をクリックします。ボタンの下のラベルには 5 + 1 = 51 と表示されます。結果は 6 になります。これは修正するバグです。

5 + 1 の計算結果は 51 です。6 にする必要があります。

この例では、5 + 1 の計算結果は 51 です。6 にする必要があります。

[ソース] パネルの UI について

DevTools には、CSS の変更、ページ読み込みパフォーマンスのプロファイリング、ネットワーク リクエストのモニタリングなど、さまざまなタスク向けのさまざまなツールが用意されています。[ソース] パネルでは、JavaScript をデバッグします。

  1. DevTools を開くと、[ソース] パネルが表示されます。

    [ソース] パネル。

[ソース] パネルには次の 3 つのセクションがあります。

[ソース] パネルの 3 つのセクション。

  1. ファイルツリーが表示された [ページ] タブ。ページがリクエストするすべてのファイルがここに表示されます。
  2. [コードエディタ] セクション。[ページ] タブでファイルを選択すると、そのファイルの内容がここに表示されます。
  3. [Debugger] セクション。ページの JavaScript を検査するためのさまざまなツール。

    DevTools ウィンドウが広い場合、デフォルトでは [コードエディタ] の右側に [デバッガ] が表示されます。この場合、[Scope] タブと [Watch] タブは、[Breakpoints]、[Call stack] などのセクションと並んで、折りたたみ可能なセクションとして表示されます。

幅広いウィンドウの右側にあるデバッガ。

ブレークポイントでコードを一時停止する

このような問題をデバッグする一般的な方法は、スクリプトの実行時に値を検査するために、コードに多くの console.log() ステートメントを挿入することです。次に例を示します。

function updateLabel() {
  var addend1 = getNumber1();
  console.log('addend1:', addend1);
  var addend2 = getNumber2();
  console.log('addend2:', addend2);
  var sum = addend1 + addend2;
  console.log('sum:', sum);
  label.textContent = addend1 + ' + ' + addend2 + ' = ' + sum;
}

console.log() メソッドでも目的を達成できますが、ブレークポイントを使用すると、より迅速に目的を達成できます。ブレークポイントを使用すると、コードの実行中にコードを一時停止し、その時点でのすべての値を調べることができます。ブレークポイントには、console.log() メソッドに比べて次のようなメリットがあります。

  • console.log() を使用する場合、コンソールにメッセージを表示するには、ソースコードを手動で開き、関連するコードを見つけて console.log() ステートメントを挿入してから、ページを再読み込みする必要があります。ブレークポイントを使用すると、コードの構造を知らなくても、関連するコードを一時停止できます。
  • console.log() ステートメントでは、検査する各値を明示的に指定する必要があります。ブレークポイントを使用すると、その時点でのすべての変数の値が DevTools に表示されます。コードに影響を与えている変数に気付いていないこともあります。

つまり、ブレークポイントを使用すると、console.log() メソッドよりも迅速にバグを見つけて修正できます。

アプリの仕組みをよく考えてみると、間違った合計(5 + 1 = 51)が、[Add Number 1 and Number 2] ボタンに関連付けられている click イベント リスナーで計算されていると推測できます。そのため、click リスナーの実行時にコードを一時停止することをおすすめします。イベント リスナー ブレークポイントを使用すると、次のことを行えます。

  1. [デバッガ] セクションで [イベント リスナー ブレークポイント] をクリックしてセクションを開きます。DevTools に、アニメーションクリップボードなど、展開可能なイベントカテゴリのリストが表示されます。
  2. [マウス] イベント カテゴリの横にある [展開] をクリックします。DevTools には、clickmousedown などのマウスイベントのリストが表示されます。各イベントの横にチェックボックスがあります。
  3. [クリック] チェックボックスをオンにします。これで、click イベント リスナーがいずれかが実行されたときに自動的に一時停止するように DevTools が設定されました。

    [クリック] チェックボックスがオンになっている。

  4. デモに戻り、[電話番号 1 と電話番号 2 を追加] をもう一度クリックします。DevTools はデモを一時停止し、[ソース] パネルでコード行をハイライト表示します。DevTools は、次のコード行で一時停止する必要があります。

    function onClick() {
    

    別のコード行で一時停止している場合は、正しい行で一時停止するまで [ Resume Script Execution] を押します。

イベント リスナー ブレークポイントは、DevTools で利用できる多くの種類のブレークポイントの 1 つにすぎません。各タイプは最終的にさまざまなシナリオをできるだけ早くデバッグするのに役立つため、すべてのタイプを検討することをおすすめします。各タイプの使用方法とタイミングについては、ブレークポイントを使用してコードを一時停止するをご覧ください。

コードをステップ実行する

バグの一般的な原因の 1 つは、スクリプトが間違った順序で実行されることです。コードをステップ実行すると、コードの実行を 1 行ずつ確認し、想定とは異なる順序で実行されている場所を正確に特定できます。今すぐ試す:

  1. DevTools の [ソース] パネルで、 [次の関数呼び出しにステップイン] をクリックして、onClick() 関数の実行を 1 行ずつステップ実行します。DevTools で次のコード行がハイライト表示されます。

    if (inputsAreEmpty()) {
    
  2. [ Step over next function call] をクリックします。

    DevTools は、inputsAreEmpty() にステップインせずに inputsAreEmpty() を実行します。DevTools が数行のコードをスキップしていることに注目してください。これは、inputsAreEmpty() が false と評価されたため、if ステートメントのコードブロックが実行されなかったためです。

これがコードのステップ実行の基本的な考え方です。get-started.js のコードを確認すると、バグは updateLabel() 関数のどこかにあることがわかります。コードのすべての行をステップ実行するのではなく、別のタイプのブレークポイントを使用して、バグの可能性のある場所の近くでコードを一時停止できます。

コード行のブレークポイントを設定する

コード行ブレークポイントは、最も一般的なタイプのブレークポイントです。一時停止する特定のコード行がある場合は、コード行ブレークポイントを使用します。

  1. updateLabel() のコード最後の行を見てみましょう。

    label.textContent = addend1 + ' + ' + addend2 + ' = ' + sum;
    
  2. コードの左側には、この特定のコード行の行番号(32)が表示されます。[32] をクリックします。DevTools では、32 の上に青いアイコンが表示されます。これは、この行にコード行ブレークポイントがあることを意味します。このコード行が実行される前に、DevTools が常に一時停止するようになりました。

  3. [ Resume script execution] をクリックします。スクリプトは、32 行目に到達するまで実行を続けます。29 行目、30 行目、31 行目では、DevTools によって addend1addend2sum の値が宣言の横にインラインで表示されます

DevTools は、32 行目のコード行ブレークポイントで一時停止します。

この例では、DevTools は 32 行目のコード行ブレークポイントで停止します。

変数の値を確認する

addend1addend2sum の値が不審な場合。引用符で囲まれているため、文字列です。これは、バグの原因を説明するための良い仮説です。次に、詳細情報を収集します。DevTools には、変数値を調べるための多くのツールが用意されています。

方法 1: スコープを検査する

コードの行で一時停止すると、[スコープ] タブに、実行のこの時点で定義されているローカル変数とグローバル変数、および各変数の値が表示されます。適用可能な場合は、閉じ変数も表示されます。コードの行で一時停止していない場合、[