Переменные: let, const, var
В JavaScript три способа объявить переменную. У каждого свои правила.
let
Современный способ для изменяемых значений:
let count = 0;
count = 1;
count = 2;
const
Для значений, которые не меняются:
const name = 'Алиса';
name = 'Боб'; // ошибка
const не значит «неизменяемое значение». Объект можно менять, но нельзя переприсвоить:
const user = { name: 'Алиса' };
user.name = 'Боб'; // ок
user = { name: 'Боб' }; // ошибка
var
Старый способ. Почти всегда заменяется на let и const.
var x = 10;
Проблемы var:
- Функциональная область видимости вместо блочной
- Hoisting — переменная доступна до объявления (как
undefined) - Можно объявить повторно
if (true) {
var x = 1;
}
console.log(x); // 1, хотя x объявлена внутри блока
Область видимости
Блочная (let, const)
if (true) {
let x = 1;
const y = 2;
}
console.log(x); // ошибка
Функциональная (var)
function test() {
var x = 1;
}
console.log(x); // ошибка
Hoisting
var поднимается в начало функции, let и const — нет:
console.log(x); // undefined
var x = 1;
console.log(y); // ошибка: Cannot access before initialization
let y = 1;
Temporal Dead Zone
let и const существуют в временной мёртвой зоне — от начала блока до объявления:
{
console.log(x); // ошибка
let x = 1;
}
Что выбрать
- const — по умолчанию
- let — если значение меняется
- var — никогда в новом коде
Именование
- camelCase:
userName,totalCount - Латинские буквы, цифры,
_,$ - Не начинается с цифры
- Регистрозависимо:
nameиName— разные - Осмысленные имена:
count, а неc
Верхний уровень в модулях
// module.js
top = 'global'; // ошибка в strict
Итоги
constпо умолчанию,letдля изменяемыхvarустарелletиconst— блочная областьvar— функциональная- Hoisting и TDZ — важные понятия