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

209
Vistas
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 Respuestas
Responde la pregunta

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 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