В чем разница между var, let и const

Ответ

var - устаревший способ объявления переменных, имеет функциональную область видимости и поднимается (hoisting). Может быть переопределена и изменена.

let - имеет блочную область видимости ({}), не поднимается, может быть изменена, но не переопределена в пределах блока.

const - аналогична let, но не может быть переопределена или изменена после инициализации (кроме объектов и массивов, где можно менять свойства/элементы).

if (true) {
  var a = 1;
  let b = 2;
  const c = 3;
}
console.log(a); // 1
console.log(b); // ReferenceError
console.log(c); // ReferenceError

Лучше всегда использовать const по умолчанию, и let только когда нужно переопределять переменную. var не рекомендуется.

Ответ 18+ 🔞

Слушай, а вот этот var — это как дедушка в семействе переменных, старый, видавший виды, но уже слегка поехавший крышей. У него функциональная область видимости, то есть он виден во всей функции, где его объявили, даже если объявили его где-то внизу, в самом пиздеце кода. Это называется hoisting — его как будто поднимают наверх, но только объявление, а не значение. И его можно переопределять сколько угодно, как последнего распиздяя. Полный бардак, если честно.

А вот let и const — это уже более адекватные потомки, с блочной областью видимости. Это значит, что они живут только внутри своих фигурных скобок {}, как в той квартире, из которой не выходят. let можно менять, но переопределять заново в том же блоке — низя, пишет ошибку. А const — это вообще константа, её переопределить нельзя, но вот если это объект или массив, то свойства и элементы внутри менять можно, потому что меняется содержимое, а не сама переменная. Это как если ты приковал себя цепью к батарее — ты никуда не денулся, но руки свободны, можешь делать что угодно, хоть в жопу себе пальцем тыкать.

Смотри на примере, тут всё понятно станет:

if (true) {
  var a = 1;
  let b = 2;
  const c = 3;
}
console.log(a); // 1 — потому что `var` вылез наружу, как хитрая жопа
console.log(b); // ReferenceError — `b` тут нихуя не видно, сидит в блоке
console.log(c); // ReferenceError — `c` тоже, как в танке

Так что мой совет — всегда начинай с const, это как сказать "всё, ребята, тут менять ничего не будем". А если вдруг понадобится что-то менять, переходи на let. А var — выбрось нахуй, он только проблемы создаёт, как пиздопроебибна в чистом виде.