¿En qué alcance se almacenan las variables del módulo en node.js?
Cuando hago esto en mi módulo node.js:
var abc = '123';
¿A dónde va? Y con esto quiero decir: en el navegador entrawindow.abc
(si no se ejecuta en una función o no)
Si ejecuto esto:
abc = '123';
Entonces puedo encontrarlo en global.abc
, pero no es así como lo quiero.
A diferencia del navegador, donde las variables se asignan de forma predeterminada al espacio global (es decir, la ventana), en Node las variables tienen como ámbito el módulo (el archivo) a menos que usted explícitamente a module.exports.
De hecho, cuando ejecuta node myfile.js
o require('somefile.js')
el código en su archivo se empaqueta de la siguiente manera:
(function (exports, require, module, __filename, __dirname) {
// your code is here
});
Todas las demás respuestas son 100% correctas, pero pensé en agregar una lista ampliada/definitiva de los alcances dentro de una aplicación Node.js en caso de que alguien encuentre esto a través de Google mientras comienza a aprender Node.js o JavaScript:
Alcance global
Todo lo declarado sin la var
palabra clave en cualquier archivo será accesible desde cualquier lugar que se ejecute en la misma instancia del servidor Node:
// foo.js
bar = 'baz';
// qux.js
console.log(bar); // prints 'baz'
Tenga en cuenta que esto se considera una mala idea, porque hace que su aplicación esté fuertemente "acoplada", lo que significa que tendría que abrir foo.js para descubrir por qué bar = 'baz'
en qux.js.
Alcance del módulo
Todo lo declarado con la var
palabra clave en el nivel superior (no dentro de una función u objeto, o cualquier otro bloque) de un archivo node.js está en el alcance del módulo y será accesible desde cualquier lugar dentro del mismo archivo, pero no existirá en ningún otro lugar. :
// foo.js
var bar = 'baz';
console.log(bar); // prints 'baz'
// qux.js
console.log(bar); // prints 'undefined'
Alcance de la función
Todo lo declarado usando la var
palabra clave dentro de una función solo será accesible desde esa función y no desde ningún otro lugar:
// foo.js
function myFunction() {
var bar = 'baz';
console.log(bar); // prints 'baz'
}
function myOtherFunction() {
console.log(bar); // prints 'undefined'
}
// qux.js
console.log(bar); // prints 'undefined'
JavaScript tiene un alcance funcional . A diferencia de otros lenguajes ( con ámbito de bloque ), las variables declaradas en un bloque dentro de una función son accesibles desde cualquier otro lugar de esa función principal . Por ejemplo, esto significa que si declaras una nueva variable dentro de un bucle, también será accesible fuera de ese bucle, siempre y cuando todavía estés dentro de la función principal:
function myFunction() {
while (thing === true) {
var bar = 'baz';
thing = false;
}
console.log(bar); // prints 'baz'
}
sombreado
Si "redeclara" una variable existente, por ejemplo, utiliza la var
palabra clave con un nombre de variable que ya se ha utilizado, entonces el valor asociado con ese nombre de variable se sobrescribe dentro del alcance de la nueva declaración :
var bar = 'foo';
console.log(bar) // prints 'foo'
function myFunction() {
var bar = 'baz';
console.log(bar);
}
myFunction(); // prints 'baz'
console.log(bar) // prints 'foo'