← Назад к вопросам
Почему переменные верхнего уровня в модулях 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 и делает код предсказуемым.