Если мы используем переменную, а эта переменная определена позже, то ошибки не возникнет. Ошибки не возникнет так как при 1-ом проходе компилятору уже известны все переменные. Начальное значение переменных при 1-ом проходе undefined
То есть как будто происходит поднятие переменных вверх до их использования.
Html
<html>
<body>
<script>
alert(text1); // увидим текст "Undefined"
var text1 = "Hello"; // объявили переменную text1
</script>
</body>
</html>
Html
<html>
<body>
<script>
// вычислять
var c = a * b;
// c = NaN
// объявляем переменные
var a = 5;
var b = 8;
</script>
</body>
</html>
Html
<html>
<body>
<script>
var c = a * b;
// Ошибка! переменные a и b нигде не объявлены (ни в начале, ни в конце)
</script>
</body>
</html>