Почему JavaScript поднимает переменные?

Почему JavaScript поднимает переменные?

Каково было обоснование дизайнеров, когда они решили осуществить подъем? Есть ли другие популярные языки, которые делают это?

Пожалуйста, предоставьте соответствующие ссылки на документацию и / или записи.

1 ответ

Решение

Как объясняет Стоян Стефанов в книге "Шаблоны JavaScript", подъем является результатом реализации интерпретатора JavaScript.

Интерпретация кода JS выполняется в два этапа. Во время первого прохода интерпретатор обрабатывает объявления переменных и функций.

Второй проход на самом деле является этапом выполнения кода. Интерпретатор обрабатывает выражения функций и необъявленные переменные.

Таким образом, мы можем использовать концепцию "подъема" для описания такого поведения.

Надеюсь это поможет.

Создатель JS Брендан Эйх однажды сказал (в Твиттере):

"Таким образом, подъем var был [] непреднамеренным следствием подъема функции, отсутствия области видимости блока, [и] JS как срочного задания 1995 года".

Он также объяснил, что...

"функция подъема позволяет выполнять декомпозицию программы сверху вниз, 'let rec' бесплатно, вызовите перед объявлением; var hoisting с тегами."

Есть ли другие популярные языки, на которых это можно сделать?

Я не знаю других популярных языков, которые поднимали бы переменные таким же образом. Я думаю, что даже ActionScript - другая реализация ECMAScript, используемая при разработке Flash - не поддерживает подъем. Это стало источником путаницы и разочарования для разработчиков, знакомых с другими языками и изучающих JavaScript.

ОБНОВЛЕНИЕ: из комментариев Python имеет аналогичное поведение при подъеме переменных.

Это потому, что интерпретатор JavaScript интерпретирует код в два цикла.

  1. Завершение / компиляция кода:
  2. Выполнение кода:

В первом цикле все объявления переменных и функций переносятся в верхнюю часть области функций, в которой они выполняются. Это помогает в создании variableObjects за execution context функции еще до ее выполнения.

На втором этапе присваивание значений, операторы кода и вызовы функций происходят построчно ожидаемым образом.

У вас есть немного более подробное прочтение здесь.

Это даст вам лучшую картину вокруг поведения вокруг let, const а также class объявления, а также приоритет, который следует между переменной и функциями.

Другие вопросы по тегам