Ошибка `Uncaught ReferenceError: Cannot access 'start' before initialization` возникает из-за так называемого "временного мёртвого времени" (Temporal Dead Zone, TDZ), которое связано с переменными, объявленными с помощью `let` и `const`.
Давайте разберёмся с причиной возникновения этой ошибки и тем, как она может меняться с добавлением условий.
Когда вы объявляете переменную с помощью `let` или `const`, она не доступна до момента, когда интерпретатор JavaScript доходится до строки, где эта переменная была объявлена. Это называется временным мёртвым временем.
Рассмотрим пример кода:
```javascript
if (true) {
console.log(start); // Здесь будет ошибка: Cannot access 'start' before initialization
let start = 10;
console.log(start); // Эта строка выполнится, если удалить первую
}
```
В этом фрагменте, когда интерпретатор достигает первой строки внутри блока `if`, он видит, что переменная `start` была объявлена с помощью `let`, но инициализация ещё не произошла. Таким образом, при попытке доступа к `start` происходит ошибка, так как переменная находится в состоянии временного мёртвого времени.
Если вы удалите первую строку `console.log(start);`, ошибки не будет:
```javascript
if (true) {
let start = 10;
console.log(start); // Здесь ошибок нет, выводится 10
}
```
Здесь переменная инициализируется перед любым доступом к ней, и ошибок не возникает.
Если в другом вашем примере используется `var`, то аналогичное ограничение временного мёртвого времени не будет иметь места, так как переменные, объявленные с помощью `var`, поднимаются (hoisting), и инициализируются автоматически значением `undefined`. Тем не менее, переменные с `let` и `const` требуют, чтобы доступ к ним происходил только после окончания их объявления.
Таким образом, добавление условия `if` само по себе не является причиной возникновения ошибки. А вот то, что вы пытаетесь обратиться к переменной, ещё не инициализированной в данном лексическом контексте, и приводит к этой ошибке.