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

208
Visualizações
Se excedió el tamaño máximo de la pila de llamadas: inicializador de objetos con referencia a uno mismo

Mientras jugaba con un ejemplo simple de Javascript Object Initializer , no pude encontrar una explicación mientras el siguiente código:

 const obj = { self: this }; console.log(obj);

conduciría a un Error: Maximum call stack size exceeded ?

Mientras tanto, un bloque inicializador ligeramente diferente pero puede parecer similar de la siguiente manera:

 const obj = { self: obj }; console.log(obj);

conduciría a un Error: Cannot access uninitialized variable. mientras que el siguiente ejemplo que usa inicializadores de métodos funciona perfectamente bien:

 const obj = { name: 'Bob', a() { return obj.name; }, b() { return this.name; }, }; console.log(obj.a()); console.log(obj.b());

¿Puede dar más detalles sobre el proceso de inicialización del objeto y por qué el lenguaje permite el objeto de subinicialización y this uso de referencia dentro de los inicializadores del método y no en los valores de propiedad?

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

Caso 1 this === global

Aquí this es el contexto global de javascript. Normalmente es enorme y contiene muchas referencias circulares. Cuando console.log() un objeto con referencias circulares, el resultado depende de la implementación (no arroja un error en Chrome 93.0.4577.63 ).

 console.log({ self: this });

Vea lo que es globalThis .

Vea cómo imprimir una referencia circular.

Caso 2 obj is undefined

Esta es una sintaxis no válida. Primero se evaluará la expresión { self: obj } , luego se realizará la asignación. Pero cuando la expresión se evalúa, obj no existe, por lo tanto, conduce a Error: Cannot access uninitialized variable. .

 const obj = { self: obj };

Esto hará lo que esperas:

 const obj = {}; obj.self = obj;

Caso 3

El último ejemplo no está relacionado con los otros ejemplos en absoluto.

  • Nunca crea una referencia circular ni intenta registrar una.
  • Accede a obj desde a() en un momento diferido, por lo que const obj = ya se ha realizado.
 const obj = { name: 'Bob', a() { // This is executed only when calling `a()` return obj.name; }, b() { // `this` here is not the global context bu `obj` return this.name; }, }; // Both functions returns a string, so no circular dependency here console.log(obj.a()); console.log(obj.b());

Esta función conducirá a los errores que ve arriba:

 const obj = { a() { obj.self = notExisting; return obj; }, b() { this.self = this; return this; }, };
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