Какие плюсы и минусы использования var в JavaScript?

Ответ

В современном JavaScript (включая Node.js) использование var считается устаревшей практикой. Вот ключевые отличия:

Минусы var (почему не стоит использовать):

  • Отсутствие блочной области видимости: Переменная, объявленная с var, видна во всей функции, что приводит к классической проблеме в циклах с замыканиями.
    for (var i = 0; i < 3; i++) {
        setTimeout(() => console.log(i), 100); // Выведет 3, 3, 3
    }
    // С `let` вывод был бы 0, 1, 2
  • Поднятие (Hoisting) с инициализацией undefined: Переменная var поднимается в начало своей области видимости и инициализируется как undefined, что может маскировать ошибки.
    console.log(x); // undefined (не ошибка)
    var x = 5;
  • Возможность повторного объявления: Это может случайно перезаписать переменную.
    var name = 'Alice';
    var name = 'Bob'; // Разрешено, 'Alice' перезаписана

Плюсы var (скорее, исторические особенности):

  • Function-scoped область видимости: Иногда это может быть намеренным поведением, когда переменная должна быть доступна во всей функции.
  • Совместимость: Полная поддержка в очень старых средах выполнения.

Рекомендация для Node.js: Всегда используйте const для значений, которые не будут переназначаться, и let для переменных, которые будут меняться. Это делает код предсказуемым и предотвращает множество типичных ошибок.

Ответ 18+ 🔞

А, слушай, про var в JavaScript — это вообще отдельная песня, ёпта. Как будто на дворе 2002-й год, честное слово. Ну ладно, разбираемся, почему эту штуку сейчас все так дружно посылают нахуй.

Минусы var (или "почему от него бомбит")

Главная засада — у этой переменной область видимости — вся функция, а не блок. Представь, ты в циклах работаешь, а она тебе под ноги коврик выдергивает. Классический пиздец, который всех настигает:

for (var i = 0; i < 3; i++) {
    setTimeout(() => console.log(i), 100); // Выведет 3, 3, 3, блядь!
}
// А вот с `let` было бы 0, 1, 2 — как нормальные люди и ожидают.

Вот это "3, 3, 3" — это и есть результат того, что i одна на всю функцию, и к моменту срабатывания таймера она уже улетела в космос. Удивление пиздец, когда впервые видишь.

Дальше — поднятие (Hoisting), но какое-то кривое. Переменную var как будто выдергивают вверх, но инициализируют её undefined. Получается, ты можешь обращаться к хер знает чему, и тебе даже ошибку не скажут — просто undefined. Маскировка ошибок на уровне искусства.

console.log(x); // undefined, а не ошибка! Вот же хитрая жопа.
var x = 5;

И, конечно, повторное объявление. Можно нагородить кучу var с одним именем, и они будут мирно друг друга перезаписывать. Случайно задеть такую переменную — проще простого.

var name = 'Alice';
var name = 'Bob'; // Разрешено! А Алиса уже, блядь, в прошлом.

Плюсы var (ну, если это можно так назвать)

Честно? Их почти нет. Разве что область видимости на всю функцию — иногда, в очень старых или специфичных случаях, это могло быть нужно. И совместимость с древними браузерами, которые уже, наверное, в музее пылятся.

Так что делать-то в Node.js?

Да всё просто, как три копейки. Забей на var хуем в стену. Серьёзно.

  • const — для всего, что не планируешь менять. Константа, приехали.
  • let — для переменных, которые будут меняться. Всё.

Это делает код в разы предсказуемее и отсекает кучу потенциальных косяков ещё на берегу. Доверия к такому коду — овердохуища, а не как с этим старым барахлом.