Skip to main content

Область видимості

1. Визначення

Область видимості функції - це внутрішня "зона видимості", що створюється під час виклику функції.

Усі змінні, оголошені за допомогою var, let, const або function всередині функції, доступні лише всередині цієї функції та її вкладених функцій.

Іншими словами:

  • змінні "живуть" тільки всередині функції, де вони оголошені;
  • ззовні їх неможливо побачити.

2. Приклад

javascript
function sayHi() { const name = 'Богдан'; console.log('Привіт,', name); } sayHi(); console.log(name); // ReferenceError: name is not defined

Змінна name доступна лише всередині функції sayHi(). Ззовні вона не існує - тому що це область видимості функції.


3. Функція створює власне "лексичне оточення"

Кожен виклик функції створює нове оточення (scope), де живуть свої змінні.

javascript
function counter() { let count = 0; return () => ++count; } const c1 = counter(); const c2 = counter(); console.log(c1()); // 1 console.log(c1()); // 2 console.log(c2()); // 1

Тут у c1 і c2 - різні області видимості з різними змінними count.


4. Області видимості вкладаються одна в одну

JS використовує лексичну (статичну) область видимості - функція "пам'ятає", де вона оголошена, а не де викликана.

javascript
let a = 10; function outer() { let b = 20; function inner() { let c = 30; console.log(a, b, c); } inner(); } outer(); // 10 20 30
  • inner має доступ до a, b, c;
  • outer - до a, b;
  • глобальна область - лише до a.

Це ієрархія областей видимості (scope chain).


5. Область видимості var vs let / const

ОголошенняОбласть видимості
varФункціональна (уся функція)
let, constБлочна (всередині { ... })

Приклад:

javascript
function test() { if (true) { var x = 1; let y = 2; } console.log(x); // 1 console.log(y); // ReferenceError } test();

6. Приклад "витоку" за відсутності function scope

javascript
if (true) { var x = 10; } console.log(x); // 10 - змінна "витекла"

var не має блочної області, лише функціональну. Якщо обгорнути код у функцію - все безпечно:

javascript
function run() { var x = 10; } console.log(x); // ReferenceError

7. Глобальна vs локальна область видимості

РівеньДе видна зміннаПриклад
ГлобальнаСкрізь у кодіlet appName = "MyApp"
ФункціональнаТільки всередині функціїfunction foo() { let x = 1; }
БлочнаТільки в {}if (...) { let y = 2; }

8. Область видимості і замикання

Замикання використовують область видимості функції, щоб "захоплювати" змінні із зовнішньої області:

javascript
function makeCounter() { let count = 0; return function() { return ++count; }; } const counter = makeCounter(); console.log(counter()); // 1 console.log(counter()); // 2

Функція "пам'ятає" область видимості, де вона створена.


ПІДСУМОК

ВластивістьОпис
Що такеОбласть, де видні змінні і функції
Коли створюєтьсяПід час виклику функції
Де змінні видніВсередині функції та вкладених функцій
Що не видноЗмінні ззовні функції
Тип області у varФункціональна
Тип області у let/constБлочна
Пов'язано зЗамиканнями, лексичним оточенням, scope chain

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.