ES6 Переменные

До появления стандарта ECMAScript 6 (ES6) единственным способом объявления переменных было использование ключевого слова var. В случае отсутствия явного объявления переменной она автоматически становилась частью глобального объекта (window в браузере). Когда программа работала в строгом режиме (use strict), попытка обращения к незадекларированной переменной приводила к ошибке выполнения программы (ReferenceError).

С выходом ES6 разработчики получили возможность выбирать между тремя способами объявления переменных: var, let и const.


Ключевое слово var

Объявление переменных через var работает следующим образом:

Область видимости переменных, созданных с использованием var, ограничена функцией, где эта переменная была объявлена (функциональная область видимости):

  • Если переменная объявлена за пределами какой-либо функции, она становится доступной во всей программе (глобальная область видимости).
  • Внутри функций переменные принадлежат именно данной функции, даже если блок объявлений находится внутри локальных конструкций вроде циклов или условных операторов.

При этом важно отметить, что объявление переменной с помощью var происходит на уровне функции целиком. То есть, переменная, определённая внутри какого-то блока кода (например, условия или цикла), будет видна вне данного блока.

Пример

Работа var:


// Глобальное пространство имен
var x = 5.6;

// Локальное пространство имен внутри функции
function myFunction() {
  var y = 10;
  console.log(y); // выводит '10'
}

myFunction(); // вызываем функцию
console.log(x); // выводит '5.6' (доступна извне)
console.log(y); // возникает ошибка ReferenceError, потому что y не является глобальной переменной


Ключевое слово let

Переменные, созданные с помощью let, обладают блочной областью видимости. Это значит, что такие переменные видны исключительно внутри своего блока ({}) и остаются невидимыми снаружи этого блока.

Это помогает избежать неожиданных побочных эффектов, связанных с изменением значений переменных в разных частях программы.

Например, цикл for создаёт новую переменную-счётчик каждую итерацию цикла, и после завершения цикла такая переменная больше недоступна.

Пример

Работа let:


// Объявляем переменную на верхнем уровне
let x = 5.6;

// Цикл, создающий временную переменную i, доступную только внутри цикла
for (let i = 0; i < 5; i++) {
  console.log(i); // выводим значения от 0 до 4
}

console.log(i); // здесь возникнет ошибка ReferenceError, поскольку i существует только внутри блока цикла


Ключевое слово const

Ключевое слово const предназначено для объявления неизменяемых (константных) переменных. Как и let, оно также обладает блочной областью видимости. Однако, если вы попытаетесь изменить значение такой переменной позже, JavaScript выдаст ошибку (TypeError).

Обратите внимание, что неизменность относится непосредственно к самой ссылке на значение, а не к содержимому переменной. Например, если речь идёт про объекты или массивы, хотя саму ссылку поменять нельзя, изменения элементов объектов/массивов допустимы. То есть const не определяет постоянное значение, а определяет постоянную ссылку на значение. Это означает, что:

  • Вы не можете переопределить значение константы.
  • Вы не можете переопределить массив или объект, объявленные как константы.
  • Но вы можете изменять элементы массива или свойства объекта.

Пример

Работа const:


// Создаём константу
const x = 5.6;

// Попытка изменить её приведёт к ошибке
x = 10; // TypeError: cannot assign to read-only property 'x'

// Массивы и объекты тоже могут быть константами
const arr = [1, 2, 3]; 
arr.push(4); // теперь arr равен [1, 2, 3, 4], добавляя элемент разрешено!

const obj = { name: "Alice" };
obj.age = 30; // обновили свойство объекта, ошибок нет


Заключение

Поддерживая разные способы объявления переменных (var, let и const), стандарт ES6 предоставил разработчикам гибкость и точность управления переменными. Использование ключевых слов let и const улучшает структуру кода, минимизирует риск случайных изменений переменных и делает программу более безопасной и понятной для поддержки и чтения другим программистам. Рекомендуется применять let и const там, где это возможно, отдавая предпочтение постоянным данным (const), чтобы минимизировать возможные ошибки при разработке больших приложений.