Самая главная вещь, с которых начинается каждый курс по JavaScript — но которые до сих пор путают даже опытные разработчики: var
, let
, const
.
Они все "создают переменные", но работают по-разному. Разберёмся, чем.
1. var
var name = "Анна";
Область видимости: функциональная (а не блочная).
Это значит, что var
видна внутри всей функции, даже если объявлена в if
или for
.
if (true) {
var x = 10;
}
console.log(x); // 10 — работает! (но это странно)
Поднятие (hoisting): переменная "всплывает" в начало области видимости, но со значением
undefined
.
console.log(y); // undefined, а не ошибка
var y = 5;
Можно переопределять и перезаписывать — даже случайно.
Минус: легко получить утечки, баги и непредсказуемое поведение.
2. let
— современная замена var
let age = 25;
Область видимости: блочная (
{}
), то есть только внутри if
, for
, function
и т.п.
if (true) {
let z = 20;
}
console.log(z); // Ошибка! z не существует здесь
Тоже всплывает, но в зону "temporal dead zone" — нельзя использовать до объявления.
console.log(name); // Ошибка: Cannot access 'name' before initialization
let name = "Петя";
Можно менять значение, но нельзя переобъявлять в одном блоке.
let a = 1;
a = 2; // ок
let a = 3; // ошибка!
Используйте
let
, если значение будет меняться.
3. const
— для неизменяемых значений
const PI = 3.14;
Блочная область видимости, как у
let
.
Нельзя переопределять и нельзя оставлять без значения.
const user; // Ошибка: Missing initializer
user = "Том";
Но!
const
не делает значение глубоко неизменяемым:
const user = { name: "Лена" };
user.name = "Маша"; // ок! Объект можно менять
user = {}; // ошибка! Переприсвоить нельзя
Используйте
const
по умолчанию. Если нужно менять — тогда let
.
Сравнение в двух строках:
Область видимости | Можно менять | Можно переобъявлять | |
---|---|---|---|
var |
функция | да | да |
let |
блок {} |
да | нет |
const |
блок {} |
нет* | нет |
* — нельзя переприсвоить, но можно менять свойства объектов
Используйте
const
по умолчанию
Если нужно менять значение —
let
Забудьте про
var
(если только не поддерживаете древний код)