es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué el código da error si intento acceder al arreglo devuelto por str.split(), inmediatamente en la siguiente línea?

¿Por qué sucede que el siguiente código arroja el error “Uncaught ReferenceError: Cannot access “arr” before initialization”?

function swap(str,a,b){
    let arr = str.split("")
    [arr[a],arr[b]] = [arr[b],arr[a]]
    return arr.join("")
}

swap("abcde",2,4) // arroja el error "Uncaught ReferenceError: Cannot access 'arr' before initialization"

Pero tan pronto como inserto una declaración ficticia entre la línea 2 y la línea 3, sorprendentemente el código comienza a funcionar.

function swap(str,a,b){
    let arr = str.split("")
    23456; // esto puede ser cualquier cosa, como una declaración de variable o cualquier instrucción válida de JavaScript
    [arr[a],arr[b]] = [arr[b],arr[a]]
    return arr.join("")
}

swap("abcde",2,4) // devuelve "abedc" como se esperaba

Me sorprende ver por qué ahora esto funciona. Debería haber dado error en ambos casos o debería haber funcionado en ambos casos.

Estoy seguro de que en el primer caso, el método “split” no termina su trabajo hasta que se ejecute la línea 3, y en el segundo caso, está obteniendo suficiente tiempo debido a una declaración adicional en el medio.

Pero aún así me encantaría obtener una explicación clara de por qué se comporta así.

No estoy seguro si esto es lo mismo para todos los navegadores, pero lo he probado en Chrome y Safari en Mac, y ambos me dieron el mismo error.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón del error se debe al uso de la palabra clave let para declarar la variable arr. Al usar let, la variable no se inicializa hasta que se ejecuta la declaración. En el primer ejemplo, la asignación de desestructuración [arr[a],arr[b]] = [arr[b],arr[a]] se ejecuta antes de que se termine de ejecutar la declaración let arr = str.split(""). Por lo tanto, arr aún no está inicializada y se produce el error.

    En el segundo ejemplo, la instrucción ficticia 23456; retrasa la ejecución de la asignación de desestructuración, dando suficiente tiempo para que arr se inicialice antes de que se utilice. Por eso el código funciona sin errores.

    En general, es una buena práctica declarar siempre las variables antes de utilizarlas para evitar este tipo de errores.

Comments are closed.