In quale ambito sono memorizzate le variabili del modulo in node.js?

Quando faccio questo nel mio modulo node.js:

var abc = '123'; 

Dove va? E con questo intendo: nel browser va in window.abc (se non eseguito in una funzione o altrimenti)

Se eseguo questo:

 abc = '123'; 

Quindi posso trovarlo su global.abc , ma non è così che lo voglio.

A differenza del browser, in cui le variabili vengono assegnate di default allo spazio globale (ad es. La finestra), le variabili del nodo sono associate al modulo (il file) a meno che non le si assegni esplicitamente a module.exports.

Infatti, quando esegui il node myfile.js o require('somefile.js') il codice nel tuo file è incapsulato come segue:

 (function (exports, require, module, __filename, __dirname) { // your code is here }); 

Tutte le altre risposte sono corrette al 100%, ma ho pensato di aggiungere un elenco espanso / definitivo degli ambiti all’interno di un’applicazione Node.js nel caso in cui qualcuno si imbatta in questo tramite Google mentre inizia a imparare Node.js o JavaScript:

Ambito globale

Qualsiasi cosa dichiarata senza la parola chiave var in qualsiasi file sarà accessibile da qualsiasi posizione in esecuzione nella stessa istanza del server Node:

 // foo.js bar = 'baz'; // qux.js console.log(bar); // prints 'baz' 

Nota che questa è ampiamente considerata una ctriggers idea, perché rende la tua app fortemente “accoppiato”, il che significa che dovresti aprire foo.js per capire perché bar = 'baz' in qux.js

Ambito del modulo

Qualunque cosa dichiarata con la parola chiave var al livello più alto (non all’interno di una funzione o object, o qualsiasi altro blocco) di un file node.js è nel campo del modulo e sarà accessibile da qualsiasi parte all’interno dello stesso file, ma non esisterà da nessuna parte altro:

 // foo.js var bar = 'baz'; console.log(bar); // prints 'baz' // qux.js console.log(bar); // prints 'undefined' 

Ambito della funzione

Qualsiasi cosa dichiarata usando la parola chiave var all’interno di una funzione sarà accessibile solo da quella funzione, e non da qualsiasi altra parte:

 // 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 è funzione ambito . A differenza di altri linguaggi (con scope ristrette ), le variabili dichiarate in un blocco all’interno di una funzione sono accessibili da qualsiasi altra parte in quella funzione genitore . Ad esempio, questo significa che se dichiari una nuova variabile all’interno di un ciclo, è accessibile anche al di fuori di quel ciclo, purché tu sia ancora all’interno della funzione genitore:

 function myFunction() { while (thing === true) { var bar = 'baz'; thing = false; } console.log(bar); // prints 'baz' } 

shadowing

Se si “redeclare” una variabile esistente, ad esempio utilizzare la parola chiave var con un nome di variabile già utilizzato, il valore associato a tale nome di variabile viene sovrascritto nell’ambito della nuova dichiarazione :

 var bar = 'foo'; console.log(bar) // prints 'foo' function myFunction() { var bar = 'baz'; console.log(bar); } myFunction(); // prints 'baz' console.log(bar) // prints 'foo' 

Il nodo ha un ambito del modulo, quindi var abc = '123' in un modulo creerà una variabile con scope (e quindi raggiungibile solo per il codice in) di quel modulo.

Vedi anche http://nodejs.org/api/globals.html#globals_global

Una domanda piuttosto vecchia, e se qualcuno è curioso delle specifiche ECMA su questa domanda, ecco il link

E non c’è modo per l’accesso diretto per le variabili del modulo (eccetto per i moduli importati):

I valori dei record di ambiente e ambiente lessicale sono puramente meccanismi di specifica e non devono necessariamente corrispondere a qualsiasi artefatto specifico di un’implementazione di ECMAScript. È imansible per un programma ECMAScript accedere o manipolare direttamente tali valori.