Hola, me preguntaba por qué lo siguiente devuelve indefinido:
let variable; module.exports.initialize = () => { variable = "123"; }; module.exports.variable = variable;Simplemente necesito el módulo en el archivo A y luego llamo a la función de inicialización. En el archivo BI lo requiere y console.log la variable pero devuelve indefinida. ¿Que me estoy perdiendo aqui?
module.exports.variable es una propiedad en el objeto module.exports . Cuando inicializa su módulo, asigna el valor de variable a esa propiedad module.exports.variable y ese valor no está undefined en el momento en que lo asigna (porque aún no se ha llamado a la función initialize() ).
Entonces, cuando su módulo termine de inicializarse, module.exports.variable no está undefined .
Luego, algún tiempo después, alguien más llama a module.exports.initialize() y eso cambia la variable local dentro de su módulo a "123" . Eso no afecta en absoluto el valor de la propiedad module.exports.variable . Queda undefined .
En el futuro, no asigne a una propiedad ni a una variable el nombre de variable , ya que hace que sea muy difícil de documentar o discutir. Un nombre diferente que no entre en conflicto con la definición en inglés de la palabra variable simplificaría la discusión de este código.
Lo que puede hacer en su lugar es exportar un objeto en lugar de un valor simple.
let myObj = { name: "John"}; module.exports.setName = (name) => { myObj.name = name; }; module.exports.sharedObj = myObj;Entonces, ¿por qué lo importas a otro lugar?
const aModule = require('./otherModule'); console.log(aModule.sharedObj); // {name: "John"} aModule.setName("Bob"); console.log(aModule.sharedObj); // {name: "Bob"} Debido a que los objetos en Javascript se asignan por puntero, cuando hizo module.exports.sharedObj = myObj; en la inicialización del módulo, colocó un puntero a myObj en module.exports.sharedObj , de modo que cuando myObj cambie, cualquier persona que vea module.exports.sharedObj también verá ese cambio. Esto solo funciona de esta manera para objetos en Javascript, no para otros tipos de valores (cadenas, números, etc.).
En JavaScript hay dos tipos de valores: 1) tipo primitivo y 2) tipo de referencia . los valores primitivos siempre se copian por su valor y los tipos de referencia siempre se copian por sus referencias (no por sus valores).
Ejemplos de valores primitivos: undefined, null, boolean, string, number . Ejemplos de tipos de referencia: todos los tipos que no sean tipos primitivos. por ejemplo, Object, array etc. Vea el fragmento a continuación.
let a = 10; let b = a; console.log(a); console.log(b); b = 20; console.log(a); console.log(b); let obj_a = {value: 1} let obj_b = obj_a; console.log(obj_a); console.log(obj_b); obj_b.value = 20; console.log(obj_a); console.log(obj_b); Entonces, cuando declara la variable como let variable su valor no está undefined y cuando asigna module.exports.variable = variable , simplemente está configurando su valor en undefined .
Vea el ejemplo a continuación.
const myExports = {}; let variable; function initialize() { variable = 10; } myExports.variable = variable; console.log(variable); console.log(myExports.variable); initialize(); console.log(variable); console.log(myExports.variable); Pero si tuviera que inicializar la variable con un tipo de referencia , por ejemplo, un objeto , entonces module.exports.variable reflejaría cualquier cambio en las propiedades de su variable variable.
Ejemplo:
const myExports = {}; let object = {}; function initialize() { object.value = 10; } myExports.variable = object; console.log(object); console.log(myExports.variable); initialize(); console.log(object); console.log(myExports.variable);Espero que tenga sentido.
intente inicializar la variable en la función module.exports.initailize
module.exports.initialize = () => { let variable; variable = "123"; }; module.exports.variable = variable;