javascript - keywords - node persistent variables
DeclaraciĆ³n de variables y alcance de Node.js (4)
Cuando escribo esto en node.js, me vuelvo undefined
.
var testContext = 15;
function testFunction() {
console.log(this.testContext);
}
testFunction();
=>undefined
Sin var
palabra clave, pasa (=> 15). Está funcionando en la consola de Chrome (con y sin palabra clave var
).
Como se menciona en el document
var algo dentro de un módulo Node.js será local para ese módulo.
Entonces, va a ser diferente ya que var testContext
está en el contexto del módulo y el contexto de esto es global
.
Alternativamente, puedes usar:
global.testContext = 15;
function testFunction() {
console.log(this.testContext);
}
testFunction();
Creo que el problema tiene que ver con la palabra clave. Si haces console.log(this)
, verás que testContext no está definido. Es posible que desee intentar:
this.testContext = 15;
function testFunction() {
console.log(this.testContext);
}
testFunction();
La diferencia clave es que todos los módulos (archivos de script) en Node.js se ejecutan en su propio closure mientras que Chrome y otros navegadores ejecutan todos los archivos de script directamente dentro del alcance global.
Esto se menciona en la documentación de Globals :
Algunos de estos objetos no están realmente en el alcance global, sino en el alcance del módulo: esto se notará.
Las var
s que declare en un módulo Nodo estarán aisladas en uno de estos cierres, por lo que deberá exportar miembros para que otros módulos puedan acceder a ellos.
Sin embargo, cuando se llama a una function
sin un contexto específico, normalmente se predetermina al objeto global , que se llama convenientemente global
en Nodo.
function testFunction() {
return this;
}
console.log(testFunction() === global); // true
Y, sin var
para declararlo, testContext
se testContext
forma predeterminada como global .
testContext = 15;
console.log(global.testContext); // 15
No funciona en Node cuando se usa var
porque testContext
es un local del módulo actual . Debes referenciarlo directamente: console.log(testContext);
.
Cuando no escribe var
, lo que sucede es que testContext
es ahora una var global en todo el proceso de nodo .
En Chrome (o en cualquier otro navegador, bueno, no estoy seguro acerca de oldIE ...), no importa si usa var
o no en su ejemplo, testContext
irá al contexto global , que es window
.
Por cierto, el "contexto global" es el predeterminado de llamadas a funciones en JS.