День 1. Scope в JavaScript — почему переменные “пропадают” в автотестах

Опубликовано: 05 Июнь 2026
на канале: Evheni Kuhar
3
0

Для инженера по автоматизации понимание Scope (области видимости) — критически важный навык.

Именно из-за него возникают ошибки вроде:
«Я же только что нашел элемент в цикле, почему я не могу использовать его дальше?»

В этом видео мы разбираем:
что такое Scope простыми словами,
почему let и const имеют блочную область видимости,
почему переменные “умирают” после { },
как правильно проектировать тесты, чтобы данные были доступны там, где нужно.

Официальное определение:
Область видимости — это контекст выполнения, в котором переменные «видны» или доступны. `let` и `const` имеют блочную область видимости, то есть они существуют только внутри пары фигурных скобок `{ }`, где были объявлены.

Простыми словами:*Это «зона доступа». Если ты создал переменную внутри функции, цикла или условия `if`, она заперта там на замок. Снаружи ты её не достанешь.

Пример 1: Ошибка видимости в UI-тесте

Представь, что ты ищешь текст ошибки на странице внутри блока `if`.

if (isErrorVisible) {
const errorMessage = "Invalid password"; // Переменная создана ВНУТРИ блока
console.log(errorMessage); // Здесь она работает
}

// Попытка использовать сообщение для финального отчета в конце теста:
console.log("Тест завершен с ошибкой: " + errorMessage);

// РЕЗУЛЬТАТ: ReferenceError: errorMessage is not defined
// Тест упадет, потому что errorMessage "умерла" сразу после закрывающей скобки }.

```

Пример 2: Переменные в блоке `try...catch`

В тестах мы часто используем `try...catch`, чтобы тест не падал при первой же ошибке. Это классический пример, где новички теряют переменные.

try {
const response = await api.get('/user/1'); // Переменная заперта внутри try
let status = response.status;
} catch (error) {
console.log("Запрос не удался");
}

// Мы хотим проверить статус в конце теста
// console.log(status); // ОШИБКА! status не виден вне блока try.

// КАК ПРАВИЛЬНО:
let status; // Объявляем снаружи (внешний scope)
try {
const response = await api.get('/user/1');
status = response.status; // Присваиваем значение внутри
} catch (e) { /*...*/ }

console.log(status); // ТЕПЕРЬ РАБОТАЕТ!

```
Пример 3: Циклы (перебор элементов)

Когда мы перебираем строки таблицы или список товаров, переменная цикла живет только внутри этого перебора.

const items = ["Apple", "Banana", "Cherry"];

for (let i = 0; i меньше items.length; i++) {
const currentItem = items[i];
console.log(`Проверяем товар: ${currentItem}`); // Работает внутри
}

// console.log(currentItem); // ОШИБКА! Переменная currentItem существовала только пока работал цикл.

```

Итог:
Если вы объявили переменную внутри `{ }`, помните: "всё, что было в Лас-Вегасе (внутри скобок), остается в Лас-Вегасе."
Чтобы использовать данные снаружи, нужно объявить переменную (через `let`) ДО начала блока со скобками.