Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

210
Vistas
¿Por qué `const arg = arg;` produce el error "No se puede acceder antes de la inicialización"?

Encontré un comportamiento realmente extraño en el que nunca había pensado antes. No estoy seguro de si esto está relacionado con TDZ porque pensé que TDZ se trataba del alcance externo al alcance interno, no al revés como en este caso. Preste atención a arg en los siguientes ejemplos.

 // Works const test = { func: (arg) => { const obj = { foo: arg, } return obj.foo; } }
 // Error const test = arg => { { const arg = arg; // Cannot access 'arg' before initialization } }
about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

El problema es que ha declarado una nueva variable arg dentro del bloque de función, y eso oculta la variable arg en el ámbito externo, por ejemplo, la declarada como parámetro de función.

Así, el arg en el lado derecho de la const arg = arg; la asignación hace referencia a la misma variable que la que se hace referencia en el lado izquierdo. NO hace referencia al parámetro arg de la función de flecha. Por lo tanto, está haciendo exactamente lo que dice el error, haciendo referencia a una variable antes de inicializarla (¡mientras intenta inicializarla!).

Esto se demuestra fácilmente usando nombres únicos:

 const test = arg => { { const inner_arg = arg; } }

¿Por qué usarías el mismo nombre de todos modos? No solo da como resultado el problema anterior, sino que es imposible leer el código. ¿Quizás está haciendo esto por costumbre como lo haría en un constructor de clases? Pero en ese caso puede diferenciar entre el parámetro y el campo de clase con this , por ejemplo, this.arg = arg .

about 4 years ago · Juan Pablo Isaza Denunciar

0

El motivo del mensaje de error es que las declaraciones let y const tienen un alcance de bloque , lo que significa que solo se puede acceder a ellas dentro del { } que las rodea . Entonces, debido a const o let , no se accederá a la variable (arg) del ámbito externo si se define otra variable (arg) dentro de un ámbito de bloque.

O en otras palabras: La variable arg dentro de parentheses o curly brackets no es lo mismo que el arg que le pasas a la función porque usas let o const adentro.

Mientras analiza el alcance del bloque, el motor ya reserva el nombre para CADA variable definida en el interior. Pero solo serán accesibles después de la declaración y evaluación usando const o let.

Entonces, leerlo, mientras se escribe en él, provoca el error que ve.

 var variable; { // [block/env start] let variable = variable; // ReferenceError: Cannot access 'variable' before initialization } // [block/env end]

Lo que sucede durante let variable = variable es que tiene que leer el lado derecho antes de asignar el valor/referencia al lado izquierdo, pero por definición, la variable no está disponible antes de la declaración, por lo que arroja el error.

Otro ejemplo sería:

 var variable; { console.log(variable); // ReferenceError: Cannot access 'variable' before initialization let variable; }

El orden de ejecución es similar a la asignación en su ejemplo y arroja el mismo error. No accederá a la variable externa porque otra variable se define dentro de ese alcance de bloque usando let/const.

También puedes echar un vistazo a las Declaraciones Let y Const .

Las declaraciones let y const definen variables cuyo ámbito es el LexicalEnvironment del contexto de ejecución en ejecución. Las variables se crean cuando se crea una instancia del Registro de entorno que las contiene, pero no se puede acceder a ellas de ninguna manera hasta que se evalúe el LexicalBinding de la variable. A una variable definida por un LexicalBinding con un Initializer se le asigna el valor de su Initializer's AssignmentExpression cuando se evalúa el LexicalBinding, no cuando se crea la variable. Si un LexicalBinding en una declaración let no tiene un Inicializador, a la variable se le asigna el valor indefinido cuando se evalúa el LexicalBinding.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda