Em que escopo as variables ​​do módulo são armazenadas em node.js?

Quando faço isso no meu módulo node.js:

var abc = '123'; 

Onde isso vai? E por isso quero dizer: no navegador vai em window.abc (se não for executado em uma function ou não)

Se eu executar isso:

 abc = '123'; 

Então eu posso encontrá-lo em global.abc , mas não é assim que eu quero.

Ao contrário do navegador, onde as variables ​​são, por padrão, atribuídas ao espaço global (ou seja, a janela), as variables ​​do Nó têm escopo para o módulo (o arquivo), a menos que você as atribua explicitamente a module.exports.

De fato, quando você executa o node myfile.js ou require('somefile.js') o código em seu arquivo é compactado da seguinte forma:

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

Todas as outras respostas estão 100% corretas, mas eu pensei em adicionar uma lista expandida / definitiva dos escopos dentro de um aplicativo Node.js no caso de alguém se deparar com isso via Google enquanto começa a aprender Node.js ou JavaScript:

Âmbito global

Qualquer coisa declarada sem a palavra-chave var em qualquer arquivo será acessível de qualquer lugar em execução na mesma instância do servidor Node:

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

Note que isso é amplamente considerado uma má ideia, porque torna seu aplicativo fortemente “acoplado” – o que significa que você teria que abrir foo.js para descobrir por que bar = 'baz' em qux.js

Escopo do Módulo

Qualquer coisa declarada com a palavra-chave var no nível superior (não dentro de uma function ou object, ou qualquer outro bloco) de um arquivo node.js está no escopo do módulo e será acessível de qualquer lugar dentro do mesmo arquivo, mas não existirá em nenhum lugar outro:

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

Escopo da function

Qualquer coisa declarada usando a palavra-chave var dentro de uma function só será acessível dentro dessa function, e não em qualquer outro 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 tem escopo de function . Ao contrário de outras linguagens (com escopo de bloco ), as variables ​​declaradas em um bloco dentro de uma function são acessíveis de qualquer outro lugar nessa function pai . Por exemplo, isso significa que, se você declarar uma nova variável dentro de um loop, ela também estará acessível fora desse loop, contanto que você ainda esteja dentro da function pai:

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

Sombreamento

Se você ‘redeclare’ uma variável existente, por exemplo, use a palavra-chave var com um nome de variável que já tenha sido usado, então o valor associado ao nome dessa variável será sobrescrito dentro do escopo da nova declaração :

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

O nó tem um escopo de módulo, portanto, var abc = '123' em um módulo criará uma variável com escopo para (e, portanto, acessível apenas para código) esse módulo.

Veja também http://nodejs.org/api/globals.html#globals_global

Pergunta bastante antiga, e se alguém está curioso sobre as especificações do ECMA sobre esta questão, aqui está o link

E não há como acessar diretamente as variables ​​do módulo (exceto os módulos importados):

Ambientes lexicais e valores de registro de ambiente são puramente mecanismos de especificação e não precisam corresponder a nenhum artefato específico de uma implementação do ECMAScript. É impossível que um programa ECMAScript acesse diretamente ou manipule tais valores.