Это связано с тем, что интерпретатор javascript интерпретирует код за два цикла.
- Автозавершение / компиляция кода:
- Выполнение кода:
В 1-м цикле все объявления переменных и функций переносятся в верхнюю часть области действия функции, в которой они выполняются. Это помогает в создании variableObjects
дляexecution context
of функции еще до ее выполнения.
На 2-м этапе присвоение значений, операторы кода и вызовы функций происходят построчно, как и ожидалось.
Вы можете прочитать немного подробнее
здесь.
Это даст вам более полную картину вокруг поведения вокруг let
, const
и class
деклараций, также приоритете следует между переменными и функциями.