- Особенности переменных let и const
- Область видимости и возможность переопределения
- Поведение в блочной и функциональной областях
- Применение переменных let и const
- Переменные типа let
- Переменные типа const
- Ошибки и избегание проблем
- Выбор между let и const в зависимости от изменяемости данных
- Примеры использования let и const в реальных проектах
- Видео:
- ES6 #2 Объявления переменных (var, let, const)
Особенности переменных let и const
Для начала, давайте разберем, что такое область видимости или scope. В отличие от устаревшего var, который имеет функциональную область видимости, современные конструкции предоставляют блочную область видимости. Это означает, что переменные, объявленные с помощью этих ключевых слов, доступны только внутри блока, в котором они были объявлены.
Например, в следующем коде переменная discounted, объявленная с помощью let, доступна только внутри блока if:
if (true) {
let discounted = true;
console.log(discounted); // true
}
console.log(discounted); // Ошибка: discounted не определена
С помощью такой блочной области видимости можно избежать неожиданных ошибок, которые могут возникнуть из-за переопределения переменных с одинаковыми именами в разных частях кода.
Теперь поговорим о поднятии (hoisting). Хотя переменные, объявленные с помощью let и const, тоже поднимаются, они не инициализируются, как это происходит с var. Это означает, что доступ к ним до объявления вызовет ошибку. Рассмотрим пример:
console.log(expr); // Ошибка: Cannot access 'expr' before initialization
let expr = 'Hello';
Важное отличие: const должна быть инициализирована в момент объявления, в то время как let можно объявить и инициализировать позже. Переменная, объявленная с помощью const, не может быть переназначена, но объект, на который она ссылается, может изменяться. Например:
const fullname = { firstName: 'Уолтер', lastName: 'Уайт' };
fullname.firstName = 'Тайлер'; // Работает
fullname = { firstName: 'Tyler', lastName: 'Дюрант' }; // Ошибка: Assignment to constant variable.
Эти особенности делают let и const предпочтительными для использования в современных приложениях, помогая избежать многих проблем, связанных с управлением переменными.
Область видимости и возможность переопределения
В JavaScript переменные могут быть объявлены с помощью различных ключевых слов, таких как var, let и const. Эти объявления имеют разные свойства, особенно в контексте области видимости и возможности переназначения.
Переменные, объявленные с var, имеют функциональную область видимости. Это означает, что они доступны во всей функции, в которой были объявлены, независимо от блока, в котором находятся. Это может привести к проблемам с поднятием, когда переменная доступна до момента своего объявления.
Например, если мы объявим переменную с var внутри цикла, она будет доступна даже за пределами этого цикла:
for (var i = 0; i < 10; i++) {
console.log(i);
}
console.log(i); // 10 Переменные, объявленные с let и const, имеют блочную область видимости. Они доступны только в том блоке кода, в котором были объявлены. Это позволяет избежать неожиданных ошибок, связанных с поднятием переменных:
if (true) {
let discountPrice = 100;
const john = "John Doe";
console.log(discountPrice); // 100
console.log(john); // John Doe
}
console.log(discountPrice); // Ошибка: discountPrice не определена
console.log(john); // Ошибка: john не определен Кроме того, переменные, объявленные с const, не могут быть переназначены. Если вы попробуете переназначить const, произойдёт ошибка:
const unauthorized_code = 12345;
unauthorized_code = 67890; // Ошибка: переназначение константы Важно помнить, что const не делает данные неизменяемыми, а только защищает ссылку на объект или значение. Например, в случае объектов или массивов можно изменять их содержимое, но нельзя переназначать саму переменную:
const ourObject = { key: "value" };
ourObject.key = "newValue"; // Это допустимо
ourObject = { newKey: "newValue" }; // Ошибка: переназначение константы Для того чтобы понять, как область видимости влияет на наш код, давайте рассмотрим пример с функцией:
function gecko() {
var scopeVar = "I am a function scope variable";
let blockVar = "I am a block scope variable";
const blockConst = "I am also a block scope constant";
console.log(scopeVar); // I am a function scope variable
console.log(blockVar); // I am a block scope variable
console.log(blockConst); // I am also a block scope constant
}
gecko();
console.log(scopeVar); // Ошибка: scopeVar не определена
console.log(blockVar); // Ошибка: blockVar не определена
console.log(blockConst); // Ошибка: blockConst не определена Таким образом, область видимости и возможность переопределения переменных играют важную роль в структурировании кода и предотвращении ошибок. При разработке на JavaScript важно учитывать эти аспекты, чтобы писать чистый и безопасный код.
Поведение в блочной и функциональной областях

Начнем с блочной области. Блочные области создаются с помощью таких конструкций, как циклы, условные выражения и блоки кода, ограниченные фигурными скобками. Переменные, объявленные внутри этих блоков, доступны только в пределах данного блока. Это значит, что при выходе из блока они перестают существовать.
Например, если мы объявим переменную внутри цикла for, она будет доступна только внутри этого цикла:
for (let i = 0; i < 5; i++) {
console.log(i); // Работает
}
console.log(i); // Ошибка: i не определена Здесь переменная i существует только в пределах цикла for. Попытка обратиться к ней за пределами цикла вызовет ошибку, так как она была объявлена в блочной области.
Теперь поговорим о функциональной области. Когда переменная объявляется внутри функции, она доступна только в пределах этой функции. Такая переменная называется локальной. Рассмотрим пример:
function newFunction() {
let number = 10;
}
newFunction();
console.log(number); // Ошибка: number не определена В этом случае переменная number объявлена внутри функции newFunction, и мы не можем обратиться к ней вне этой функции. Это связано с тем, что область видимости данной переменной ограничена телом функции.
Важно отметить, что блочные области могут быть вложены друг в друга, создавая более сложные структуры видимости. Например, переменные, объявленные внутри блока, будут доступны только в этом блоке, даже если этот блок находится внутри функции:
function outerFunction() {
let outerVar = 'Hello';
if (true) {
let innerVar = 'World';
}
console.log(innerVar); // Ошибка: innerVar не определена
}
outerFunction(); В этом примере переменная innerVar доступна только внутри условного блока if, тогда как outerVar доступна во всей функции outerFunction.
Понимание различий между блочной и функциональной областями видимости важно для написания корректного и эффективного кода. Зная, где и как объявлять переменные, вы сможете избежать множества распространенных ошибок и улучшить структуру вашего кода.
Применение переменных let и const
Переменные типа let
Переменные типа let объявляются в блоке и доступны только внутри этого блока, что позволяет избежать конфликтов с другими переменными. Это особенно полезно в функциях и циклах, где требуется уникальный scope для каждой итерации или вызова.
- Объявление и инициализация: Переменная должна быть инициализирована перед использованием. Например:
-
let number = 10; - Поднятие: Переменные типа
letне поднимаются (hoisted), какvar, поэтому попытка обратиться к переменной до её объявления вызовет ошибку: -
console.log(number); // Ошибка, переменная не доступна до объявления let number = 10; - Область видимости: Переменные доступны только внутри блока, в котором были объявлены. Рассмотрим пример:
-
for (let i = 0; i < 5; i++) { console.log(i); // Доступна переменная i } console.log(i); // Ошибка, переменная i не доступна за пределами блока
Переменные типа const
Переменные, объявленные с помощью const, имеют те же особенности, что и let, с той разницей, что их значение не может быть изменено после инициализации. Это позволяет создать защищенные от изменений переменные, которые всегда будут сохранять своё значение.
- Объявление и инициализация: Переменная должна быть инициализирована при объявлении. Например:
-
const base_url = "https://example.com"; - Неперезаписываемость: Попытка изменить значение переменной вызовет ошибку:
-
const base_url = "https://example.com"; base_url = "https://example.org"; // Ошибка, значение переменной нельзя изменить - Объекты и массивы: Если переменная типа
constявляется объектом или массивом, вы можете изменять их свойства или элементы, но не саму переменную: -
const user = { name: "Alice", age: 25 }; user.age = 26; // Это допустимо const numbers = [1, 2, 3]; numbers.push(4); // Это тоже допустимо user = { name: "Bob", age: 30 }; // Ошибка, переменная не может быть переназначена numbers = [4, 5, 6]; // Ошибка, переменная не может быть переназначена
Ошибки и избегание проблем

При использовании let и const можно избежать множества распространенных ошибок, связанных с var, таких как проблемы с hoisted переменными и случайными перезаписями значений. Правильное использование новых видов переменных помогает сделать код более читабельным и предсказуемым.
Рассмотрим еще один пример, чтобы закрепить разницу:
function getFinalPrice(price, tax) {
let finalPrice = price + tax;
return finalPrice;
}
const taxRate = 0.07;
let price = 100;
console.log(getFinalPrice(price, taxRate)); // Выведет 107
Таким образом, использование let и const помогает управлять переменными более эффективно, избегая множества потенциальных ошибок и делая код более структурированным и понятным.
Выбор между let и const в зависимости от изменяемости данных
Когда мы работаем с данными в JavaScript, часто возникает вопрос, как лучше объявить переменную, чтобы код был понятным и эффективным. Основная идея состоит в том, чтобы выбрать способ объявления переменной, который наиболее точно соответствует логике нашего кода и позволяет избежать ошибок.
Для начала давайте рассмотрим основные ситуации, в которых стоит выбирать один способ объявления переменной над другим. Все зависит от того, планируем ли мы изменять значение переменной в дальнейшем или нет. Такой подход помогает сделать код более предсказуемым и устойчивым к ошибкам.
- Если значение не должно изменяться, то лучше использовать подход, который закрепляет его неизменность. Это позволяет защитить переменную от случайного изменения, что может быть критично для стабильности и корректности работы скрипта.
- Когда же мы знаем, что значение переменной будет меняться в процессе выполнения кода, следует выбрать способ, который позволяет это делать. Таким образом, мы сможем гибко управлять состоянием переменной в пределах блоков кода и функций.
Рассмотрим несколько примеров и подробно объясним, как лучше объявить переменную в зависимости от контекста использования:
- Когда мы объявляем константу с фиксированным значением, например, URL-адрес API, который не будет изменяться на протяжении всего выполнения скрипта:
- Если у нас есть счётчик в цикле, значение которого будет изменяться, то здесь подойдёт другой способ объявления:
- Для работы с объектами и массивами, которые могут быть изменены (например, добавление новых элементов или изменение свойств объекта), лучше всего использовать подход, который фиксирует саму ссылку на объект, но позволяет изменять его содержимое:
const apiUrl = 'https://api.example.com/data'; Таким образом, попытка изменить значение apiUrl произойдёт ошибка, что и нужно для неизменяемых данных.
cssCopy code
for (let i = 0; i < 10; i++) {
console.log(i);
} Этот метод позволяет счётчику изменяться при каждой итерации цикла, что необходимо для корректного выполнения логики.
rubyCopy code
const user = {
name: 'John',
age: 30
};
user.age = 31; // Это допустимо
Тоже самое относится и к массивам:
const numbers = [1, 2, 3];
numbers.push(4); // Добавление элемента в массив допустимо
Таким образом, выбор способа объявления переменной зависит от того, как именно вы планируете работать с данными. Если данные не должны изменяться, используйте подход, который фиксирует значение. В противном случае выбирайте способ, который позволяет изменять значение переменной, чтобы ваш код оставался логичным и удобным в сопровождении.
Теперь, когда мы подробно разобрали, как и когда использовать различные способы объявления переменных, вы сможете более уверенно писать код, который будет защищён от непреднамеренных изменений и ошибок.
Примеры использования let и const в реальных проектах
Чтобы понять, как применять ключевые слова let и const в реальных проектах, давайте рассмотрим несколько примеров. Это поможет вам осознать, где именно следует использовать каждое из них и как они влияют на ваш код. Важно учитывать их особенности видимости и возможности изменения значений, чтобы писать более чистый и предсказуемый код.
Рассмотрим ситуацию, когда нужно работать с циклами. Предположим, у нас есть массив цен, и мы хотим применить скидку к каждому элементу. Для этого удобнее всего использовать let, так как значение discountPrice будет изменяться на каждом шаге цикла:
let prices = [100, 200, 300];
let discount = 0.1;
for (let i = 0; i < prices.length; i++) {
let discountPrice = prices[i] * (1 - discount);
console.log(`Цена со скидкой: ${discountPrice}`);
}
Здесь переменная discountPrice объявляется и инициализируется в пределах блока цикла, и её значение обновляется на каждом шаге. Такой подход помогает избежать ошибок, связанных с повторным использованием значений из предыдущих итераций.
В случае, когда значение не должно изменяться после инициализации, используется const. Например, при работе с объектами конфигурации или константами:
const MAX_DISCOUNT = 0.2;
const BASE_URL = "https://doka.guide";
function applyMaxDiscount(price) {
return price * (1 - MAX_DISCOUNT);
}
console.log(`Максимальная скидка применена: ${applyMaxDiscount(500)}`);
console.log(`Базовый URL: ${BASE_URL}`);
Переменные, объявленные с const, такие как MAX_DISCOUNT и BASE_URL, не могут быть переопределены. Это значит, что их значения фиксированы на момент инициализации, что позволяет избежать случайных изменений и улучшает предсказуемость кода.
Далее, рассмотрим пример с let и const в контексте использования их в функциях и классах. Представим ситуацию, когда у нас есть класс Bar, и нам нужно создать экземпляры этого класса с разными значениями:
class Bar {
constructor(value) {
this.value = value;
}
}
let a = new Bar(10);
const b = new Bar(20);
console.log(`Значение a: ${a.value}`);
console.log(`Значение b: ${b.value}`);
a = new Bar(30);
// b = new Bar(40); // Произойдет ошибка, так как переменная b объявлена с const
console.log(`Значение a после изменения: ${a.value}`);
console.log(`Значение b после попытки изменения: ${b.value}`);
Здесь видно, что a, объявленная с let, может быть переопределена, тогда как b, объявленная с const, остаётся неизменной после первоначальной инициализации. Такое поведение важно учитывать при создании объектов, которые могут или не могут изменяться.
Эти примеры показывают, как грамотно использовать let и const в различных сценариях. Правильное понимание и использование этих ключевых слов позволяет избежать многих ошибок и делает код более читабельным и поддерживаемым.








