JavaScript debugger Statement: Debugging with Breakpoints

The JavaScript debugger statement is a powerful debugging tool that allows you to pause the execution of your code at specific points. When a browser’s developer tools are open, encountering a debugger statement will halt the script’s execution, letting you inspect variables, step through your code line by line, and understand the flow of your program in real-time. This makes it an invaluable tool for finding and fixing errors effectively.

Purpose of the debugger Statement

The primary purpose of the debugger statement is to:

  • Set Breakpoints: Insert breakpoints directly into your JavaScript code without needing to use browser developer tools to set them manually.
  • Inspect Variables: Examine the state of your variables at a specific point in the program.
  • Step Through Code: Progress through your code line by line, enabling detailed debugging of complex logic.
  • Understand Program Flow: Gain a clear understanding of how your code is executed and how data changes over time.
  • Simplify Debugging: Make it easy to pause your code and debug errors without setting breakpoints manually via browser tools

Syntax of the debugger Statement

The syntax is straightforward: simply use the debugger keyword in your JavaScript code.

debugger;

This statement doesn’t require any arguments or parentheses. When the JavaScript engine encounters it, the browser’s debugger will be invoked (if active) to halt execution at that point. If the debugger is not active, the debugger statement will have no effect and the code will continue to run normally.

How to use debugger

To effectively use the debugger statement, it is important to:

  1. Insert strategically: Place debugger statements at points where you suspect errors or areas where you want to examine the current state of your variables.
  2. Open browser dev tools: Make sure that you have the developer tools (typically opened by pressing F12 or Ctrl+Shift+I) open in your browser.
  3. Run your code: When JavaScript interpreter will reach debugger statement, it will pause the execution.
  4. Use dev tools: Use the debuggers’ features, such as stepping, inspecting variables, or setting watch variables to find and debug your code.

Examples of Using the debugger Statement

Let’s look at a few practical examples demonstrating how to use the debugger statement effectively.

Example 1: Basic Breakpoint Usage

In this example, we’ll insert a debugger statement within a simple loop to see how it pauses the execution.

<button onclick="runDebuggerExample1()">Run Example 1</button>

<script>
function runDebuggerExample1() {
  let sum = 0;
  for (let i = 1; i <= 5; i++) {
    debugger; // Breakpoint here
    sum += i;
  }
  console.log("Sum:", sum);
}
</script>

Output:

When you click the “Run Example 1” button, the code execution will pause at the debugger statement inside the loop. You can then use the browser’s developer tools to inspect the value of i and sum as the loop progresses and use the “step over” functionality to continue through each iteration.

Example 2: Debugging a Function

In this example, we’ll place a debugger statement inside a function to examine the state of its arguments and local variables.

<button onclick="runDebuggerExample2()">Run Example 2</button>

<script>
function runDebuggerExample2() {
  function calculateArea(width, height) {
    debugger; // Breakpoint here
    const area = width * height;
    return area;
  }

  const result = calculateArea(10, 20);
  console.log("Area:", result);
}
</script>

Output:

When “Run Example 2” is clicked, execution will pause at the debugger statement inside the calculateArea function. Use the developer tools to check the values of width, height, and other variables local to the function.

Example 3: Conditional Debugging

Here’s an example of conditional debugging where a debugger statement is activated only under a certain condition.

<button onclick="runDebuggerExample3()">Run Example 3</button>

<script>
function runDebuggerExample3() {
  let numbers = [10, 20, 30, 40, 50];
  let total = 0;

  for (let number of numbers) {
      if (number > 30) {
          debugger; // Breakpoint if number is greater than 30
      }
      total += number;
  }
  console.log("Total: ", total)
}
</script>

Output:

Clicking “Run Example 3” will pause the execution at the debugger statement when the loop reaches the number greater than 30 (i.e. 40 and 50 in this case). You can inspect how the total changes for each number.

Example 4: Debugging with Canvas

Here we combine the Canvas API with the debugger statement. This allows you to inspect the state of your canvas drawing at a specific moment.

<canvas id="canvasDebugger" width="200" height="150" style="border:1px solid black;"></canvas>
<br>
<button onclick="drawCanvasDebugger()">Draw on Canvas</button>

<script>
function drawCanvasDebugger() {
  const canvas_debugger = document.getElementById('canvasDebugger');
  const ctx_debugger = canvas_debugger.getContext('2d');

  ctx_debugger.fillStyle = 'lightblue';
  ctx_debugger.fillRect(10, 10, 80, 80);

  debugger; // Breakpoint before drawing a second rectangle

  ctx_debugger.fillStyle = 'lightgreen';
  ctx_debugger.fillRect(110, 10, 80, 80);
}
</script>

Output:

Clicking “Draw on Canvas” will pause the script’s execution after the first rectangle is drawn and before the second is rendered. At the pause, you can inspect the context’s drawing state.

Key Advantages of Using debugger

  • Direct Integration: debugger statements are part of the code, making them easy to use and maintain alongside development.
  • Improved Workflow: No need to set breakpoints manually each time you run or modify your code.
  • Flexibility: Place debugger statements wherever they are most needed, allowing for precise inspection of various code sections.
  • Conditional Pauses: Debug only specific scenarios, thereby increasing debugging efficiency.

Best Practices

  • Remove debugger Statements Before Production: Make sure to remove or comment out all debugger statements before deploying your code to production.
  • Use Strategically: Avoid excessive use of the debugger statement; place them only where necessary for effective debugging.
  • Pair with Dev Tools: Use the full debugging capabilities of your browser’s developer tools alongside the debugger statement for best results.

Browser Support

The debugger statement has excellent support across all major browsers.

Browser Supported
Chrome Yes
Firefox Yes
Safari Yes
Edge Yes
Opera Yes

Conclusion

The debugger statement is an essential tool in any JavaScript developer’s arsenal. By allowing you to strategically insert breakpoints directly into your code, it provides a quick and efficient way to inspect, debug, and understand your scripts. Use it thoughtfully to streamline your debugging process and ensure robust and error-free code.