← Назад к вопросам

Почему переменные верхнего уровня в модулях Node.js не являются глобальными?

2.0 Middle🔥 102 комментариев
#Node.js и JavaScript

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Почему переменные верхнего уровня в модулях Node.js не являются глобальными?

Переменные верхнего уровня в модулях Node.js не являются глобальными потому что в Node.js используется CommonJS модульная система с изоляцией области видимости. Каждый модуль имеет свою область видимости, отделённую от других модулей и глобального скопа.

Как работает модульная система Node.js

// module-a.js
const myVar = 'Hello from module A'; // Только в этом модуле

console.log(myVar); // OK
console.log(global.myVar); // undefined

// module-b.js
console.log(myVar); // ReferenceError: myVar is not defined
console.log(global.myVar); // undefined

Причина: Каждый модуль обёрнут в функцию

На самом деле, каждый модуль Node.js обёрнут в IIFE:

(function (exports, require, module, __filename, __dirname) {
  // Твой код модуля здесь
  const myVar = 'Hello'; // Локальная переменная функции
  
  module.exports = { /* экспорты */ };
});

// Переменные в функции ЛОКАЛЬНЫ
// Они НЕ видны снаружи и НЕ глобальны

Доказательство изоляции

// file1.js
const secretVariable = 'Secret';

module.exports = {
  getSecret: () => secretVariable
};

// file2.js
const module1 = require('./file1');

console.log(secretVariable); // ReferenceError
console.log(module1.secretVariable); // undefined
console.log(module1.getSecret()); // 'Secret'

// Нет способа получить access к secretVariable

Сравнение: Browser vs Node.js

// В БРАУЗЕРЕ (нет изоляции):
// script1.js
var myVar = 'Hello';
console.log(window.myVar); // 'Hello' — ГЛОБАЛЬНО

// script2.js
console.log(myVar); // 'Hello' — видна!

// В NODE.JS (изоляция):
// file1.js
var myVar = 'Hello';
console.log(global.myVar); // undefined

// file2.js
console.log(myVar); // ReferenceError

Почему это хорошо?

// ХОРОШО: Изоляция предотвращает конфликты
// library1.js
const VERSION = '1.0';
module.exports = { VERSION };

// library2.js
const VERSION = '2.0'; // Другая версия, нет конфликта
module.exports = { VERSION };

// app.js
const lib1 = require('./library1');
const lib2 = require('./library2');

console.log(lib1.VERSION); // '1.0'
console.log(lib2.VERSION); // '2.0'
console.log(VERSION); // ReferenceError

Как сделать переменную глобальной

// Способ 1: Явно добавить в global
global.myGlobalVar = 'I am global';

// Способ 2: Экспортировать и требовать
// global-config.js
module.exports = {
  apiUrl: 'http://api.example.com',
  timeout: 5000
};

// app.js
const config = require('./global-config');
console.log(config.apiUrl);

// Способ 3: Использовать .env
require('dotenv').config();
console.log(process.env.API_URL);

ES6 Modules (то же самое)

// module-a.mjs
const myVar = 'Hello'; // Локальная переменная
export const sharedVar = 'Shared';

// module-b.mjs
import { sharedVar } from './module-a.mjs';
console.log(myVar); // ReferenceError
console.log(sharedVar); // 'Shared'

Практический пример проблемы БЕЗ изоляции

// БЕЗ изоляции (браузер):
// lodash.js
const _ = { ... };

// underscore.js
const _ = { ... }; // Конфликт! Переопределяет

// app.js
const formatted = _.format(); // Какая версия?
// Непредсказуемо!

// С изоляцией (Node.js):
const lodash = require('lodash');
const underscore = require('underscore');

// Нет конфликтов

Изоляция модулей — это одна из главных причин, почему Node.js безопасен и масштабируем. Она предотвращает конфликты имён, облегчает refactoring и делает код предсказуемым.

Почему переменные верхнего уровня в модулях Node.js не являются глобальными? | PrepBro