Ликбез: чем различаются var, let и const в JavaScript
easy

Ликбез: чем различаются var, let и const в JavaScript

Различий гораздо больше, чем кажется

Переменные — это база в любом языке программирования. Они нужны для того, чтобы хранить все данные во время работы программы. Обычно, чтобы использовать переменную в коде, сначала её нужно объявить, но в JavaScript это можно сделать с помощью трёх ключевых слов: var, const и let

Разберёмся, чем они различаются и в каких случаях что нужно использовать.

Немного теории

Объявление переменной — когда мы говорим программе: «Вот переменная, тут будут храниться данные».

Инициализация переменной — это когда мы записываем в объявленную переменную какие-то данные первый раз.

Область видимости переменной — та часть программы, где к этой переменной можно обратиться. Область видимости бывает двух видов:

  • Функциональная: к переменной можно обращаться только внутри функции, где она была объявлена.
  • Блочная: к переменной можно обращаться внутри блока кода, обозначенного фигурными скобками {}. Например, внутри циклов или условных операторов.

Подробно про область видимости можно почитать в нашей статье про замыкания.

Повторное объявление — когда мы пытаемся ещё раз объявить переменную, которая уже была объявлена раньше в текущей области видимости.

Переназначение — запись в переменную нового значения вместо старого, которое хранилось там раньше.

Поднятие (hoisting) — механизм в JS, который поднимает переменные и функции в начало своей области видимости перед выполнением кода. Это позволяет использовать переменные и функции до их фактического объявления в коде.

А теперь перейдём к делу.

Var

Ключевое слово var появилось ещё в первых версиях JS, но сейчас от var стараются отойти при написании кода. Почему так, сейчас объясним. 

Обращение

Мы можем объявить переменную при помощи var и обратиться к ней, не присваивая ей значения:

var normal;
console.log(normal);

Ликбез: чем различаются var, let и const в JavaScript

Значение такой переменной будет undefined

Мы также можем обращаться к переменной до её фактического объявления:

console.log(weird);
var weird = "Это поднятие";

Такой код не вызовет ошибки:

Ликбез: чем различаются var, let и const в JavaScript

Это происходит потому, что переменная var поднимается (hoisting) в текущей области видимости. Переменная уже была объявлена (поднята вверх), но её значение ещё не было присвоено, поэтому выводится undefined.

Механизм поднятия применяется только к переменным, объявленным через var. Чтобы избежать путаницы в коде, лучше объявлять переменные перед их использованием. Именно поэтому сейчас многие программисты переходят с var на let, чтобы не создавать таких ситуаций, когда переменной ещё фактически нет, но с ней уже что-то происходит.

Область видимости

Переменные, объявленные через var, имеют функциональную область видимости. Это значит, что они доступны только в пределах текущей функции или глобального объекта, если функции нет.

Создадим функцию и внутри неё объявим переменную var:

function example() {
  if (true) {
    var localVar = "Это локальная переменная";
    console.log(localVar); 
  }
  console.log(localVar); 
}
example();

Мы объявили переменную localVar внутри блока if, но при этом она равно доступна внутри функции example, поскольку var не имеет блочной области видимости:

Ликбез: чем различаются var, let и const в JavaScript

Мы получаем два значения, поскольку здесь также используется механизм поднятия. Через поднятие переменная «всплывает» вверх в пределах текущей области видимости (в нашем примере — до начала функции).

Переменная localVar становится видимой во всей функции, а не только внутри блока if, где была объявлена. 

Переназначение и повторное объявление

Переменную, объявленную с помощью var, можно переназначить в любом месте кода:

var x = 5;
console.log(x);
x = 10; 
console.log(x);
Ликбез: чем различаются var, let и const в JavaScript

Также var можно заново объявить в текущем блоке. Причём количество объявлений числа может быть любым. Покажем переназначение на практике — переназначим переменную localVar:

function example() {
  if (true) {
    var localVar = "Это локальная переменная";
    var localVar = "Это другое значение переменной";
    console.log(localVar); 
  }
  console.log(localVar);    
}
example();
Ликбез: чем различаются var, let и const в JavaScript

Повторное объявление переменных считается плохой практикой, но бывают ситуации, когда оно нужно. Например, при работе с динамически загружаемыми модулями и при генерации кода на лету. 

Let

Ключевое слово let — это улучшенная версия var. Оно было представлено в ES6 в 2015 году. 

Обращение

Так же как и с var, мы можем просто объявить переменную let, не присвоив ей значение — это не вызовет ошибку:

let y
console.log(y)

Ликбез: чем различаются var, let и const в JavaScript

Мы получим значение undefined.

Но в отличие от var, где используется механизм «поднятия», к переменной let нельзя обращаться до момента объявления:

console.log(a)
var a = 5

console.log(с)
let c = 6

Ликбез: чем различаются var, let и const в JavaScript

И если в случае var мы получили undefined, то у let появилась ошибка: переменная не определена.

Область видимости

Переменные, объявленные с помощью let, могут иметь глобальную, локальную или блочную область видимости. 

Основное отличие let — оно работает только в той области видимости, где объявлена.

Возьмём наш предыдущий пример и поменяем var на let:

function example() {
  if (true) {
    let localVar = "Это локальная переменная";
    console.log(localVar); 
  }
  console.log(localVar); 
}
example();

Поскольку let имеет блочную область видимости, то переменная localVar будет видна только внутри блока if

Внутри блока мы успешно выводим значение переменной localVar. А вот попытка вывести значение переменной вне этого блока сразу вызовет ошибку. Это более логичное поведение по сравнению с var.

Ликбез: чем различаются var, let и const в JavaScript

Переназначение и повторное объявление

Повторно объявить переменную let в том же блоке кода нельзя:

let y = 20;
let y = 30

Ликбез: чем различаются var, let и const в JavaScript

Код вызовет ошибку: переменная уже объявлена.

А вот переназначить переменную let в том же блоке — можно.

let y = 20;
y = 50

Ликбез: чем различаются var, let и const в JavaScript

Const

В JavaScript const обладает всеми теми же свойствами, что и let, за исключением того, что const нельзя переназначить и что значение переменной должно быть присвоено сразу в момент объявления. Проще говоря, это константа, которую мы задаём один раз, и это значение больше не меняется, даже если попытаться это сделать.

Обращение

Значение const должно быть сразу определено сразу при объявлении переменной. Нельзя обратиться к переменной до её инициализации.

Сравним его с let и var:

var d
console.log(d)
let e
console.log(e)
const i
console.log(i)
Ликбез: чем различаются var, let и const в JavaScript

Область видимости

Здесь поведение const такое же, как и у let. Возьмём наш пример с функцией и убедимся в этом:

function example() {
  if (true) {
    const localVar = "Это локальная переменная";
    console.log(localVar); 
  }
  console.log(localVar); 
}
example();

Область видимости переменной localVar ограничивается блоком if, где она объявлена. Поэтому обращение к ней вне этого блока вызовет ошибку:

Ликбез: чем различаются var, let и const в JavaScript

Переназначение и повторное объявление

Значение const нельзя ни переназначить, ни повторно объявить в текущей области видимости. Поэтому const используется для создания постоянных переменных — констант.

const pi = 3.14159265358979323846
const pi = 3.15

Ликбез: чем различаются var, let и const в JavaScript

Лайфхак: использование const внутри циклов предотвратит ошибки изменения переменной внутри цикла.

Что и когда выбрать

Главное различие этих переменных — разная область видимости и возможность переназначения.

Используем var, когда:

  • нужно выйти за область видимости;
  • пишем код для старых браузеров. 

В остальных случаях почти всегда используется let, чтобы избежать неожиданного поведения программы и странных ошибок.

А вот const нужен для того, чтобы задать неизменяемую переменную — константу. Короче, если переменная будет меняться, то let, а если не будет — то const

Текст:

Кристина Тульцева

Редактор:

Михаил Полянин

Обложка:

Алексей Сухов

Корректор:

Ирина Михеева

Вёрстка:

Мария Дронова

Соцсети:

Юлия Зубарева

Фронтенд-разработка — востребованная профессия
На новом курсе «Практикума» о фронтенде вас обучат самым востребованным технологиям: JS и TypeScript, Flexbox и Grid, React, Git, Bash и др. Это то, что нужно работодателям сегодня. Старт — бесплатно.
Попробовать бесплатно
Фронтенд-разработка — востребованная профессия Фронтенд-разработка — востребованная профессия Фронтенд-разработка — востребованная профессия Фронтенд-разработка — востребованная профессия
Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
easy