Основные способы объявления переменных в JavaScript
Объявление переменных с помощью var
Ключевое слово var используется для объявления переменных в JavaScript с самого начала. Несмотря на появление let и const, var остается важным для понимания, особенно при работе с устаревшим кодом.
Синтаксис: var имя = значение;
var message = "Привет!";
console.log(message); // Привет!Javascript var (переменные в javascript)
"Привет!"
Область видимости переменной var ограничена функцией, в которой она объявлена, или глобальным контекстом, если объявлена вне функции.
Типичные ошибки:
- Поднятие (hoisting) - объявление переменной перемещается вверх, но инициализация остается на месте. Это может вызвать undefined.
- Отсутствие блочной области видимости - переменная var доступна за пределами блока if, for и т.д.
- Переопределение без ошибки - можно повторно объявить ту же переменную, что приводит к неявной перезаписи.
Рекомендуется избегать var в новом коде, отдавая предпочтение let и const.
Как объявить переменную с блочной областью видимости?
Ключевое слово let создает переменную, ограниченную блоком (фигурные скобки).
if (true) {
let a = 10;
}
console.log(a); // ReferenceError: a is not defined
Проблема: переменная let не существует до своего объявления (Temporal Dead Zone), поэтому обращение к ней до строки объявления вызывает ReferenceError.
Решение: всегда объявлять let в начале блока и не обращаться до инициализации.
Как объявить константу, значение которой нельзя изменить?
Ключевое слово const объявляет константу, которую нельзя переприсвоить. Однако, если константа содержит объект, его свойства можно изменять.
const PI = 3.14159;
PI = 3; // TypeError: Assignment to constant variable.
Ошибка: попытка изменить примитивную константу вызывает TypeError.
Правильное использование: const подходит для значений, которые не должны быть переопределены, например математические константы, ссылки на DOM-элементы.
Расширенные примеры использования переменных
Ниже приведены примеры, демонстрирующие особенности var, let и const.
Поднятие (hoisting) переменной var
console.log(hoistedVar); // undefined
var hoistedVar = 5;
undefined
Переменная с var "поднимается", но инициализация не происходит, поэтому значение undefined.
Разница в области видимости: var vs let в цикле for
for (var i = 0; i < 3; i++) {
setTimeout(function() { console.log(i); }, 100);
}
// Вывод: 3, 3, 3
3 3 3
for (let j = 0; j < 3; j++) {
setTimeout(function() { console.log(j); }, 100);
}
// Вывод: 0, 1, 2
0 1 2
var создает одну переменную для всего цикла, let создает новую для каждой итерации.
Временная мертвая зона (Temporal Dead Zone) для let и const
console.log(x); // ReferenceError: Cannot access 'x' before initialization
let x = 10;
Изменение свойств объекта, объявленного через const
const obj = { name: "Alice" };
obj.name = "Bob"; // разрешено
console.log(obj.name); // Bob
obj = {}; // TypeError: Assignment to constant variable.
Bob (ошибка присвоения)
Глобальная переменная через var (свойство window)
var globalVar = "test";
console.log(window.globalVar); // "test"
"test"
Переменные, объявленные через var на глобальном уровне, становятся свойствами объекта window. Для let и const это не так.
Повторное объявление var
var a = 1;
var a = 2;
console.log(a); // 2
2
Повторное объявление с var не вызывает ошибки, что может быть источником багов.
Объявление без ключевого слова (нестрогий режим)
function test() {
implicitVar = 100;
}
test();
console.log(implicitVar); // 100 (глобальная переменная)
100
В нестрогом режиме присвоение значения необъявленной переменной создает глобальную переменную. В строгом режиме (use strict) это вызывает ReferenceError.