До появления стандарта 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
), чтобы минимизировать возможные ошибки при разработке больших приложений.