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?
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 cómo imprimir una referencia circular.
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;El último ejemplo no está relacionado con los otros ejemplos en absoluto.
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; }, };