← Назад к вопросам

Какие знаешь особенности у let?

2.0 Middle🔥 201 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Особенности let в JavaScript

Ключевое слово let было введено в ES6 (ECMAScript 2015) для объявления переменных и имеет несколько важных особенностей, которые отличают его от устаревшего var.

1. Блочная область видимости (Block Scope)

Самая значительная особенность — переменные, объявленные через let, имеют блочную область видимости. Они существуют только внутри блока {}, где были объявлены.

if (true) {
    let blockScoped = "видна только внутри этого блока";
    var functionScoped = "видна везде в функции";
}
console.log(blockScoped); // ReferenceError: blockScoped is not defined
console.log(functionScoped); // Работает, если это глобальная область

Это решает классическую проблему с циклами:

for (let i = 0; i < 3; i++) {
    setTimeout(() => console.log(i), 100); // 0, 1, 2
}
for (var j = 0; j < 3; j++) {
    setTimeout(() => console.log(j), 100); // 3, 3, 3
}

2. Отсутствие всплытия (Hoisting) в привычном смысле

Переменные let технически "всплывают", но попадают в временную мертвую зону (Temporal Dead Zone — TDZ). До объявления к ним нельзя обратиться.

console.log(a); // undefined (var всплывает с undefined)
var a = 5;

console.log(b); // ReferenceError: Cannot access 'b' before initialization
let b = 10;

3. Запрет на повторное объявление в той же области

В пределах одной области видимости нельзя объявить переменную let с тем же именем.

let x = 1;
let x = 2; // SyntaxError: Identifier 'x' has already been declared

// Но это допустимо в разных блоках:
let y = 1;
if (true) {
    let y = 2; // Другая переменная в своей области видимости
}

4. Не создают свойство в глобальном объекте

При объявлении в глобальной области переменные let не становятся свойствами объекта window (в браузере).

var globalVar = "я в window";
let globalLet = "я не в window";

console.log(window.globalVar); // "я в window"
console.log(window.globalLet); // undefined

5. Поведение в циклах for-in и for-of

В циклах for-in и for-of каждая итерация создает новую привязку переменной, что предотвращает распространенные ошибки.

const obj = {a: 1, b: 2};
for (let key in obj) {
    setTimeout(() => console.log(key), 0); // Выводит 'a', затем 'b'
}

Практические последствия и рекомендации

  • Замена var: В современном JavaScript рекомендуется всегда использовать let вместо var, так как блочная область видимости более предсказуема и безопасна
  • Сочетание с const: Используйте const по умолчанию для значений, которые не должны переназначаться, и let только когда переменная действительно будет изменяться
  • Управление замыканиями: let упрощает работу с замыканиями в циклах и асинхронных операциях
  • Строгий режим: Особенности let работают одинаково как в строгом режиме, так и без него

Важное исключение: в switch все case принадлежат одному блоку, поэтому объявление let внутри одного case будет видно во всех последующих.

switch (value) {
    case 1:
        let x = 10; // SyntaxError, если есть другой case
        break;
    case 2:
        let x = 20; // Ошибка повторного объявления
        break;
}

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

Какие знаешь особенности у let? | PrepBro