Глобальні змінні
Що таке глобальні змінні
Глобальна змінна - це змінна, доступна всюди в коді.
У браузері вона зберігається в об'єкті
window, у Node.js - уglobal.
var user = 'Tim'; // глобальна змінна
console.log(window.user); // "Tim"Глобальні змінні видно всім функціям, модулям і скриптам, і вони живуть до завершення роботи програми чи оновлення сторінки.
Чому це небезпечно
1. Конфлікти імен (перезапис)
Різні частини програми (або сторонні бібліотеки) можуть випадково використати те саме ім'я.
var config = { darkMode: true };
// десь у бібліотеці
var config = { theme: 'light' };
console.log(config); // { theme: 'light' }Ти не можеш "захистити" глобальну змінну - будь-яка частина коду може її змінити.
2. Важко налагоджувати і тестувати
Коли змінна глобальна, неможливо зрозуміти:
- хто її змінив;
- коли вона змінилася;
- хто від неї залежить.
Це ускладнює логіку і робить баги непередбачуваними.
let counter = 0;
function increase() {
counter++;
}
function reset() {
counter = 0;
}
increase();
reset(); // хтось викликав - і обнулив увесь стан3. Порушення інкапсуляції
Глобальні змінні ламають модульність. Кожна частина програми знає про іншу - немає "ізольованого" коду.
Це суперечить принципам OOP і чистих функцій (які не залежать від зовнішнього стану).
4. Витоки пам'яті
Якщо глобальна змінна посилається на великий об'єкт, його ніколи не видалить збирач сміття, поки сторінка не перезавантажиться.
window.cache = new Array(1_000_000).fill('data');
// цей масив залишиться в пам'яті весь часТому що GC (Garbage Collector) не може видалити змінну, на яку є глобальне посилання.
5. Погана сумісність модулів і бібліотек
Якщо ти використовуєш кілька бібліотек, а кожна визначає свої глобальні змінні, виникають "колізії просторів імен".
// бібліотека А
window.$ = function(selector) { ... };
// бібліотека B
window.$ = 42;Браузер просто перезапише значення $,
і весь твій код на jQuery перестане працювати.
6. Складніше рефакторити і повторно використовувати
Якщо код залежить від глобальних змінних, його не можна просто "вирізати і вставити" в інший проєкт - він не буде працювати без усіх тих самих глобалок.
7. Проблеми з асинхронністю
Асинхронний код (таймери, проміси, async/await) може звертатися до однієї й тієї самої глобальної змінної у різні моменти часу - і значення можуть бути неочікуваними.
let user = 'Tim';
setTimeout(() => console.log(user), 1000);
user = 'Alice';
// через секунду: "Alice", а не "Tim"Локальні змінні всередині функції захищають від таких ефектів.
Як уникнути глобальних змінних
1. Використовувати let / const всередині функцій або блоків
function run() {
const result = 42;
console.log(result);
}
run();
console.log(result); // ReferenceError2. Використовувати модулі (ES Modules, CommonJS)
Кожен модуль має свою область видимості і експортує тільки те, що явно вказано.
// utils.js
export const sum = (a, b) => a + b;
// main.js
import { sum } from './utils.js';Тепер змінні всередині utils.js не "витікають" у глобальний контекст.
3. Використовувати об'єкти або простори імен
Якщо потрібно зберігати спільні дані - тримай їх в об'єкті, а не в голій глобальній змінній.
const App = {
config: { darkMode: true },
state: {},
init() { console.log('App started'); }
};
App.init();Усе згруповано і не конфліктує з іншими бібліотеками.
4. Використовувати замикання (closures)
Можна створити "приватний простір", недоступний зовні.
const counter = (function() {
let value = 0;
return {
inc() { value++; },
get() { return value; }
};
})();
counter.inc();
console.log(counter.get()); // 1Змінна value захищена і не "витекла" в глобальну область.
5. Використовувати "use strict"
У строгому режимі JS не дозволяє неявно створювати глобальні змінні:
"use strict";
function test() {
x = 10; // ReferenceError
}Підсумок
| Проблема | Чому небезпечно |
|---|---|
| Конфлікти імен | Різні скрипти можуть перевизначати змінні |
| Порушення модульності | Код перестає бути незалежним |
| Витоки пам'яті | Змінні живуть до перезавантаження |
| Складність тестування | Неможливо передбачити поточний стан |
| Неявна поведінка | Складно зрозуміти, хто і коли змінює дані |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.