Область видимости переменных в if-else в JavaScript

Пусть для простоты у нас есть всегда выполняющееся условие:

if (true) { }

Давайте рассмотрим следующий код:

if (true) { let res = '!'; } console.log(res);

Как вы видите, в переменную res должно записаться значение '!'. Однако, если запустить этот код, то в консоль выведется ошибка!

Дело в том, что переменные, объявленные внутри фигурных скобок, видны только внутри этих скобок, и не видны снаружи. По-научному здесь идет речь об области видимости переменных.

Можно говорить о том, что областью видимости переменных, объявленных внутри фигурных скобок, являются только эти фигурные скобки. Однако, если переменная объявлена снаружи фигурных скобок, то видна и внутри них, и снаружи:

let res; // переменная объявлена снаружи if (true) { res = '!'; } console.log(res); // выведет '!'

Пример

В следующем примере в переменную res в зависимости от условия записывается либо значение 1, либо значение 2:

let num = 5; if (num >= 0) { let res = 1; } else { let res = 2; } console.log(res);

Однако, если запустить этот код, то в консоль выведется ошибка. Как вы теперь уже понимаете, все дело в видимости переменных. Для решения проблемы объявим переменную снаружи условия:

let test = true; let res; // объявим переменную снаружи условия if (test) { res = 1; } else { res = 2; } console.log(res); // выведет 1

Автор приведенного ниже кода хотел выполнить проверку возраста на достижение 18 лет. Код, однако, не работает. Исправьте ошибку автора кода. Вот проблемный код:

let age = 17; if (age >= 18) { let adult = true; } else { let adult = false; } console.log(adult);

Нюансы

Область видимости переменных обладает некоторым нюансом. Давайте рассмотрим его на примере. Давайте объявим снаружи нашего условия переменную res с одним значением, а внутри условия поменяем это значение на другое:

let res = 1; if (true) { res = 2; } console.log(res); // выведет 2

Как вы видите, переменная res поменялась внутри условия. Все, однако, поменяется, если внутри условия также объявить переменную res через let:

let res = 1; if (true) { let res = 2; // объявим переменную через let } console.log(res); // выведет 1, а не 2!

Здесь все дело в том, что объявление переменой через let внутри условия создало локальную переменную res.

То есть внутри условия существует одна переменная res, а снаружи условия - другая. Убедится в этом можно, выведя значение переменной в консоль внутри условия:

let res = 1; if (true) { let res = 2; console.log(res); // выведет 2 } console.log(res); // выведет 1

Автор приведенного ниже кода хотел выполнить проверку возраста на достижение 18 лет. Код, однако, при любом значение возраста выводит в консоль значение undefined. Исправьте ошибку автора кода. Вот проблемный код:

let age = 17; let adult; if (age >= 18) { let adult = true; } else { let adult = false; } console.log(adult);

Автор приведенного ниже кода хотел выполнить проверку возраста на достижение 18 лет. После проверки кода оказалось, что если возраст равен или больше 18 лет, то в переменную adult записывается true, как и должно быть, однако, если возраст меньше 18, то переменная adult имеет значение undefined. Исправьте ошибку автора кода.

Вот проблемный код:

let age = 17; let adult; if (age >= 18) { adult = true; } else { let adult = false; } console.log(adult);

Автор приведенного ниже кода хотел выполнить проверку возраста. Код, однако, при любом значение возраста выводит в консоль значение undefined. Исправьте ошибку автора кода.

Вот проблемный код:

let age = 17; let res; if (age >= 18) { if (age <= 23) { let res = 'от 18 до 23'; } else { let res = 'больше 23'; } } else { let res = 'меньше 18'; } console.log(res);

Автор приведенного ниже кода хотел выполнить проверку возраста. Код, однако, при значение возраста большим 18 лет выводит в консоль значение undefined. Исправьте ошибку автора кода.

Вот проблемный код:

let age = 19; let res; if (age >= 18) { let res; if (age <= 23) { res = 'от 18 до 23'; } else { res = 'больше 23'; } } else { res = 'меньше 18'; } console.log(res);
enru