variable node keywords globales __dirname javascript node.js scope

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.