Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

253
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda