Каково было обоснование дизайнеров, когда они решили осуществить подъем? Есть ли другие популярные языки, которые делают это?
Пожалуйста, предоставьте соответствующие ссылки на документацию и/или записи.
Ответ 1
Как объясняет Стоян Стефанов в книге "Шаблоны JavaScript", подъем является результатом реализации интерпретатора JavaScript.
Интерпретация кода JS выполняется в два этапа. Во время первого прохода интерпретатор обрабатывает объявления переменных и функций.
Второй проход - это фактический шаг выполнения кода. Интерпретатор обрабатывает выражения функций и необъявленные переменные.
Таким образом, мы можем использовать концепцию "подъема" для описания такого поведения.
Ответ 2
Это потому, что интерпретатор JavaScript интерпретирует код в два цикла.
Завершение/компиляция кода:
Выполнение кода:
В 1-м цикле все объявления переменных и функций переносятся в верхнюю часть области функции, в которой они выполняются. Это помогает в создании variableObjects объектов для execution context выполнения функции еще до ее выполнения.
На втором этапе присваивание значений, операторы кода и вызовы функций происходят построчно ожидаемым образом.
У вас есть немного более подробное прочтение здесь.
Это даст вам лучшее представление о поведении вокруг объявлений let, const и class, а также о приоритете, который следует между переменной и функциями.