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

249
Vistas
ReferenceError: no se puede acceder a la declaración léxica 'Foo' antes de la inicialización

Ejecutando el siguiente código:

 <!doctype html> <html> <head> <meta charset="UTF-8"> </head> <body> <script> main() class Foo { } function main() { Foo() } </script> </body> </html>

genera ReferenceError: can't access lexical declaration 'Foo' before initialization (en Firefox 91.5.1esr, de todos modos).

Una solución simple es mover la definición de clase una línea hacia arriba. Reemplazar class Foo con function Foo() también eliminará el mensaje de error. Cambiar Foo() a new Foo() , no ayuda: el error permanece.

Pregunta: ¿Hay una referencia a los estándares y/o una descripción clara que explique este comportamiento?

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Una class es una ClassDeclaration en la especificación. Esto se clasifica como una parte de la DeclarationPart , que se clasifica como un elemento de la lista de declaraciones a los efectos de las declaraciones de alcance léxico .

Cuando un bloque o función se evalúa inicialmente (antes de que el código en el bloque realmente comience a ejecutarse), hará algo como :

 33. Let lexDeclarations be the LexicallyScopedDeclarations of code. 34. For each element d of lexDeclarations, do a. NOTE: A lexically declared name cannot be the same as a function/generator declaration, formal parameter, or a var name. Lexically declared names are only instantiated here but not initialized. b. For each element dn of the BoundNames of d, do i. If IsConstantDeclaration of d is true, then 1. Perform ! lexEnv.CreateImmutableBinding(dn, true). ii. Else, 1. Perform ! lexEnv.CreateMutableBinding(dn, false).

Estas LexicallyScopedDeclarations son identificadores creados con la sintaxis ES6+ y excluyen var . (Los identificadores creados con var se clasifican como varNames o VarDeclaredNames , que pasan por un proceso diferente a los pasos 33-34 anteriores).

Por lo tanto, al principio de un bloque o función, los identificadores de class (y los identificadores const y let ) tienen enlaces que se han creado en el entorno, pero que no se han inicializado en el entorno. La inicialización se produce cuando se ejecuta BindingClassDeclarationEvaluation , que hace lo siguiente:

 5. Perform ? InitializeBoundName(className, value, env).

Esto solo sucede cuando el motor está ejecutando el código dentro del bloque o la función y se encuentra con class SomeClassName . (Esto es independiente del proceso al que se hace referencia anteriormente, que es cuando el motor solo busca en el texto del bloque para obtener una lista de identificadores que se declaran dentro).


Cuando se está ejecutando un bloque e intenta crear una instancia de algo con new , EvaluateNew se ejecuta, lo que hace, entre otras cosas:

 Let constructor be ? GetValue(ref).

que finalmente ejecuta GetBindingValue , que tiene:

 2. If the binding for N in envRec is an uninitialized binding, throw a ReferenceError exception.

El enlace solo se inicializa cuando se ejecuta InitializeBoundName , es decir, cuando el motor encuentra la declaración de clase.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Una forma sencilla de entender por qué ocurre este error consiste en comprender la elevación. Antes de la ejecución, un intérprete (como un motor de navegador) moverá todas las variables y funciones a la parte superior del archivo, probablemente para facilitar el acceso. Pero las instancias más modernas de variables y funciones, como las clases y las expresiones de funciones, pueden subirse a la cima pero sin inicializarse. Por eso, aunque se encuentra la clase, no tiene asignado un valor adecuado, incluso si está vacía, por lo que se produce un error.

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