Así que tengo este archivo llamado digamos "fruits.js"
En este módulo, tengo una variable global "nombre" con valor "manzanas". También tengo un getter y un setter para esta variable para obtener el valor del nombre de la variable y establecer una nueva.
ahora importé este módulo a un archivo llamado "client1.js", y ejecuté getter, mostró "manzanas".
ahora ejecuté setter con valor "cocos" y cambié la variable.
ahora, después de que client1.js termine la ejecución, client2.js inicia la ejecución con el mismo código copiado.
y en lugar de "manzanas" muestra "cocos".
Entonces, mi pregunta es, ¿las importaciones múltiples del mismo módulo comparten el mismo alcance léxico?
codigo-
// fruits.js let fruit = "apples"; const set = () => { let flower = "lily"; const setfruit = (newfruit) => { fruit = newfruit; } const getfruit = () => { return fruit; } const setflower = (newflower) => { flower = newflower; } const getflower = () => { return flower; } return { setfruit, getfruit, setflower, getflower } } module.exports = set(); // client1.js const fruitsnflowers = require("./closure.js") const execute = () => { console.log(fruitsnflowers.getfruit()) console.log(fruitsnflowers.getflower()) fruitsnflowers.setfruit("coconut") fruitsnflowers.setflower("hibiscus") } module.exports = execute; // client2.js const fruitsnflowers = require("./closure.js") const execute = () => { console.log(fruitsnflowers.getfruit()) console.log(fruitsnflowers.getflower()) fruitsnflowers.setfruit("papaya") fruitsnflowers.setflower("lotus") } module.exports = execute; // driver.js const client1 = require("./client1.js") const client2 = require("./client2.js") client1() client2() // output ~ node driver.js apples lily coconut hibiscusEl código del módulo se carga e inicializa solo una vez cuando se importa por primera vez. Después de eso, se devuelve exactamente el mismo identificador de módulo de los intentos posteriores de importarlo.
Entonces, en su caso, cuando hace module.exports = set() , está ejecutando las funciones set() que devuelven un objeto que tiene referencias a funciones locales que pueden ver el alcance local. Cualquiera que importe la función obtendrá exactamente el mismo objeto exportado, por lo tanto, todos apuntarán al mismo ámbito local (dentro de este módulo).
Si llama a setFruit("banana") desde el módulo A y luego llama a getFruit() desde el módulo B, obtendrá "banana" de vuelta. El módulo de frutas solo tiene un conjunto de estado y solo una variable interna de fruits a la que tienen acceso todas las llamadas a sus métodos exportados.
Entonces, mi pregunta es, ¿las importaciones múltiples del mismo módulo comparten el mismo alcance léxico?
Su uso del término "alcance léxico" aquí es un poco confuso. Dos módulos que importan este otro módulo tienen cada uno su propio alcance léxico, pero el código dentro del módulo importado vive en su propio alcance que no cambia sin importar quién lo importe.
Entonces, si el módulo A y el módulo B importan su módulo de frutas, habrá tres ámbitos ya que cada módulo tiene su propio ámbito léxico en el nivel superior. Cuando llamas a una función de fruta, esa función opera internamente (dentro de la ejecución de la función) dentro del alcance léxico de la fruta. Cuando obtiene el valor devuelto desde el módulo A o el módulo B, entonces está operando dentro del alcance de esos módulos. No hay mezcla de los ámbitos. Cada módulo tiene su propio alcance de nivel superior.