Cómo depurar JavaScript

Kayce Basques
Kayce Basques
Sofia Emelianova
Sofia Emelianova

En este instructivo, se describe el flujo de trabajo básico para depurar problemas de JavaScript en DevTools. Sigue leyendo o mira la versión en video de este instructivo.

Reproduce el error.

El primer paso para la depuración es siempre encontrar una serie de acciones que reproduzcan un error de manera coherente.

  1. Abre esta demostración en una pestaña nueva.
  2. Ingresa 5 en el cuadro Número 1.
  3. Ingresa 1 en el cuadro Número 2.
  4. Haz clic en Add Number 1 and Number 2. La etiqueta debajo del botón dice 5 + 1 = 51. El resultado debería ser 6. Este es el error que vas a corregir.

El resultado de 5 + 1 es 51. Debe ser 6.

En este ejemplo, el resultado de 5 + 1 es 51. Debería ser 6.

Familiarízate con la IU del panel Sources

DevTools proporciona muchas herramientas diferentes para distintas tareas, como cambio de CSS, generación de perfiles de rendimiento de carga de páginas y supervisión de solicitudes de red. El panel Sources es donde depuras JavaScript.

  1. Abre DevTools y navega al panel Sources.

    El panel Sources.

El panel Sources tiene tres secciones:

Las 3 secciones del panel Sources.

  1. La pestaña Página con el árbol de archivos Aquí se muestran todos los archivos que solicita la página.
  2. La sección Code Editor. Después de seleccionar un archivo en la pestaña Página, su contenido se muestra aquí.
  3. La sección Debugger. Diversas herramientas para inspeccionar el código JavaScript de la página.

    Si la ventana de Herramientas para desarrolladores es ancha, de forma predeterminada, el Depurador se encuentra a la derecha del Editor de código. En este caso, las pestañas Scope y Watch se unen a Breakpoints, Call stack y otras como secciones que se pueden contraer.

El depurador a la derecha de la ventana ancha.

Pausa el código con un punto de interrupción

Un método común para depurar un problema como este es insertar muchas instrucciones console.log() en el código para inspeccionar los valores a medida que se ejecuta la secuencia de comandos. Por ejemplo:

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;
}

El método console.log() puede hacer el trabajo, pero los puntos de interrupción pueden hacerlo más rápido. Un punto de interrupción te permite pausar el código durante la ejecución y examinar todos los valores en ese momento. Los puntos de interrupción tienen algunas ventajas sobre el método console.log():

  • Con console.log(), debes abrir manualmente el código fuente, encontrar el código relevante, insertar las instrucciones de console.log() y, luego, volver a cargar la página para ver los mensajes en la consola. Con los puntos de interrupción, puedes realizar una pausa en el código relevante sin siquiera saber cómo está estructurado.
  • En las instrucciones console.log(), debes especificar explícitamente cada valor que deseas inspeccionar. Con los puntos de interrupción, Herramientas para desarrolladores te muestra los valores de todas las variables en ese momento. A veces hay variables que afectan el código que ni siquiera sabes que existen.

En resumen, los puntos de interrupción pueden ayudarte a encontrar y corregir errores más rápido que con el método console.log().

Si piensas cómo funciona la app, puedes darte cuenta intuitivamente que se calcula la suma incorrecta (5 + 1 = 51) en el objeto de escucha de eventos click que está asociado con el botón Add Number 1 and Number 2. Por lo tanto, es probable que te convenga pausar el código aproximadamente en el momento en que se ejecuta el objeto de escucha click. Los Puntos de interrupción del objeto de escucha de eventos te permiten hacer exactamente eso:

  1. En la sección Debugger, haz clic en Event Listener Breakpoints para expandir la sección. Las Herramientas para desarrolladores muestra una lista de categorías de eventos expandibles, como Animación y Portapapeles.
  2. Junto a la categoría de evento Mouse, haz clic en Expand. Las Herramientas para desarrolladores muestra una lista de eventos del mouse, como click y mousedown. Cada evento tiene una casilla de verificación a su lado.
  3. Marca la casilla de verificación click. DevTools ahora está configurado para hacer una pausa automáticamente cuando se ejecute cualquier objeto de escucha de eventos click.

    La casilla de verificación "click" está habilitada.

  4. Regresa a la demostración y vuelve a hacer clic en Add Number 1 and Number 2. DevTools pausa la demostración y destaca una línea de código en el panel Sources. DevTools se debe pausar en esta línea de código:

    function onClick() {
    

    Si está detenido en una línea de código diferente, presiona la ejecución de la secuencia de comandos hasta que te detengas en la línea correcta.

Los puntos de interrupción del objeto de escucha de eventos son solo uno de los muchos tipos de puntos de interrupción disponibles en DevTools. Es útil explorar todos los tipos que existen porque cada uno te ayudará a depurar diferentes situaciones con la mayor rapidez posible. Consulta Puntos de interrupción para pausas en el código para obtener información sobre cuándo y cómo usar cada tipo.

Recorre el código

Una causa común de errores es que la secuencia de comandos se ejecute en el orden incorrecto. Si recorres el código, podrás seguir la ejecución, línea por línea, y conocer exactamente qué parte se ejecuta en un orden distinto del esperado. Probar ahora:

  1. En el panel Sources de DevTools, haz clic en Step into next function call para recorrer la ejecución de la función onClick(), una línea a la vez. Herramientas para desarrolladores destaca la siguiente línea de código:

    if (inputsAreEmpty()) {
    
  2. Haz clic en Step over next function call.

    Las Herramientas para desarrolladores ejecuta inputsAreEmpty() sin recorrerla. Observa que DevTools omite algunas líneas de código. Esto se debe a que inputsAreEmpty() se evaluó como falso, por lo que no se ejecutó el bloque de código de la sentencia if.

Esa es la idea básica para recorrer el código. Si observas el código de get-started.js, puedes ver que el error probablemente se encuentra en algún lugar de la función updateLabel(). En lugar de recorrer cada línea de código, puedes usar otro tipo de punto de interrupción para pausar el código más cerca de la ubicación probable del error.

Cómo establecer un punto de interrupción de línea de código

El tipo de punto de interrupción más común es el de línea de código. Cuando tengas una línea de código específica en la que quieras hacer una pausa, usa un punto de interrupción de línea de código:

  1. Observa la última línea de código de updateLabel():

    label.textContent = addend1 + ' + ' + addend2 + ' = ' + sum;
    
  2. A la izquierda del código, puedes ver el número de línea de esta línea de código específica, que es 32. Haz clic en 32. DevTools coloca un ícono azul sobre 32. Esto significa que la línea tiene un punto de interrupción de línea de código. DevTools ahora siempre hace una pausa antes de que se ejecute esta línea de código.

  3. Haz clic en Reanudar la ejecución de la secuencia de comandos. La secuencia de comandos continúa ejecutándose hasta llegar a la línea 32. En las líneas 29, 30 y 31, las Herramientas para desarrolladores muestran los valores de addend1, addend2 y sum intercalados junto a sus declaraciones.

DevTools pausa en el punto de interrupción de línea de código en la línea 32.

En este ejemplo, DevTools se pausa en el punto de interrupción de línea de código en la línea 32.

Verifica los valores de las variables

Los valores de addend1, addend2 y sum parecen sospechosos. Están entre comillas, lo que significa que son cadenas. Esta es una buena hipótesis para explicar la causa del error. Ahora es el momento de recopilar más información. DevTools proporciona muchas herramientas para examinar valores de variables.

Método 1: Inspecciona el alcance

Cuando el código está pausado en una línea, la pestaña Scope te muestra las variables locales y globales definidas en este punto de la ejecución, junto con el valor de cada variable. También muestra variables de cierre, cuando corresponde. Cuando el código no está pausado en una línea, la pestaña Scope está vacía.

Haz doble clic en un valor de variable para editarlo.

El panel Alcance.

Método 2: Expresiones de supervisión

La pestaña Mirar te permite supervisar los valores de las variables a lo largo del tiempo. Watch no se limita solo a las variables. Puedes almacenar cualquier expresión válida de JavaScript en la pestaña Watch.

Probar ahora:

  1. Haz clic en la pestaña Watch.
  2. Haz clic en Agregar expresión de supervisión.
  3. Tipo typeof sum.
  4. Presiona Intro. Herramientas para desarrolladores muestra typeof sum: "string". El valor a la derecha de los dos puntos es el resultado de tu expresión.

El panel de expresiones supervisadas

En esta captura de pantalla, se muestra la pestaña Watch (abajo a la derecha) después de crear la expresión de supervisión typeof sum.

Como sospechábamos, sum se evalúa como una cadena, cuando debería ser un número. Confirmaste que esta es la causa del error.

Método 3: La consola

Además de ver los mensajes de console.log(), también puedes usar la consola para evaluar instrucciones arbitrarias de JavaScript. En términos de depuración, puedes usar la consola para probar posibles correcciones de errores. Probar ahora:

  1. Si el panel lateral Console no está abierto, presiona Escape para abrirlo. Se abrirá en la parte inferior de la ventana de DevTools.
  2. En la consola, escribe parseInt(addend1) + parseInt(addend2). Esta sentencia funciona porque el código está pausado en una línea donde addend1 y addend2 están dentro del alcance.
  3. Presiona Intro. Herramientas para desarrolladores evalúa la instrucción y, luego, imprime 6, que es el resultado que esperas que produzca la demostración.

El panel lateral Console después de evaluar las variables que están dentro del alcance.

En esta captura de pantalla, se muestra el panel lateral Console después de evaluar parseInt(addend1) + parseInt(addend2).

Aplica una corrección

Encontraste una solución para el error. Lo único que queda es probar la solución. Para ello, edita el código y vuelve a ejecutar la demostración. No es necesario que salgas de DevTools para aplicar la solución. Puedes editar el código JavaScript directamente en la IU de DevTools. Probar ahora:

  1. Haz clic en Reanudar la ejecución de la secuencia de comandos.
  2. En el editor de código, reemplaza la línea 31, var sum = addend1 + addend2, por var sum = parseInt(addend1) + parseInt(addend2).
  3. Presiona Command + S (Mac) o Control + S (Windows, Linux) para guardar el cambio.
  4. Haz clic en Desactivar puntos de interrupción. Su color cambia a azul para indicar que está activo. Mientras esté configurado, las Herramientas para desarrolladores ignorarán los puntos de interrupción que hayas establecido.
  5. Prueba la demostración con diferentes valores. Ahora los cálculos se realizan de manera correcta.

Próximos pasos

En este instructivo, solo se mostraron dos formas de colocar puntos de interrupción. DevTools ofrece muchas otras formas, como las siguientes:

  • Puntos de interrupción condicionales que solo se activan cuando la condición que proporciones sea verdadera
  • Puntos de interrupción en excepciones detectadas y no detectadas
  • Puntos de interrupción XHR que se activan cuando la URL solicitada coincide con una subcadena que proporciones

Consulta Cómo pausar el código con puntos de interrupción para saber cuándo y cómo usar cada tipo.

Hay un par de controles para recorrer el código que no se explicaron en este instructivo. Consulta Paso sobre una línea de código para obtener más información.