Урок 02

Переменные: 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 — важные понятия