Подтвердить что ты не робот

В какой области переменные модуля хранятся в node.js?

Когда я делаю это в своем модуле node.js:

var abc = '123';

Куда он идет? И под этим я подразумеваю: в браузере он идет в window.abc (если не выполняется в функции или иначе)

Если я выполняю это:

abc = '123';

Тогда я могу найти его в global.abc, но это не так, как я хочу.

4b9b3361

Ответ 1

В отличие от браузера, где переменные по умолчанию назначаются глобальному пространству (например, окно), переменные Node привязаны к модулю (файлу), если вы явно не назначили их module.exports.

Фактически, при запуске node myfile.js или require('somefile.js') код в вашем файле завернут следующим образом:

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

Ответ 2

Все остальные ответы на 100% правильны, но я подумал, что добавлю расширенный/окончательный список областей в приложении Node.js, если кто-нибудь столкнется с этим через Google, начав обучение Node. js или JavaScript:

Глобальная область

Все, что объявлено без ключевого слова var в любом файле, будет доступно из любого места в одном экземпляре сервера Node:

// foo.js
bar = 'baz';


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

Обратите внимание, что это считается плохой идеей, потому что это приложение сильно "связано", что означает, что вам нужно будет открыть foo.js, чтобы выяснить, почему bar = 'baz' в qux.js

Объем модуля

Все, что объявлено с ключевым словом var на верхнем уровне (не внутри функции или объекта или любого другого блока) файла Node.js, находится в объеме модуля и будет быть доступным из любого места в пределах одного и того же файла, но больше не будет существовать:

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


// qux.js
console.log(bar); // prints 'undefined'

Область функций

Все, что объявлено с помощью ключевого слова var внутри функции, будет доступно только из этой функции, а не из другого места:

// 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 - это область функций. В отличие от других (блочных) языков, переменные, объявленные в блоке внутри функции, доступны из любой другой части этой родительской функции. Например, это означает, что если вы объявляете новую переменную внутри цикла, она также доступна вне этого цикла, если вы все еще находитесь внутри родительской функции:

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

Затенение

Если вы обновляете существующую переменную, например, используйте ключевое слово var с уже используемым именем переменной, тогда значение, связанное с этим именем переменной, будет перезаписано в пределах области действия нового объявления:

var bar = 'foo';
console.log(bar) // prints 'foo'

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

Ответ 3

Node имеет область видимости модуля, поэтому var abc = '123' в модуле создаст переменную, которая привязана к этому модулю (и, следовательно, доступна только для кода).

См. также http://nodejs.org/api/globals.html#globals_global

Ответ 4

Довольно старый вопрос, и если кому-то интересно узнать о спецификациях ECMA по этому вопросу, вот ссылка

И нет способа прямого доступа к переменным модуля (кроме импортированных модулей):

Значения Lexical Environments и Environment Record являются чисто спецификационными механизмами и не должны соответствовать какому-либо конкретному артефакту реализации ECMAScript. Программа ECMAScript не может напрямую обращаться к таким значениям или манипулировать ими.