Подъем, с точки зрения непрофессионала, - это способ перемещения переменных (объявленных с использованием ключевого слова var) и объявлений функций в верхнюю часть блока кода.

На самом деле происходит следующее: на этапе компиляции кода объявления этих переменных и функций помещаются в память. Здесь важно отметить, что на этом этапе обрабатываются только объявления, а присвоения переменных остаются там, где они были изначально записаны.

  • Давайте разберемся в этом лучше с помощью приведенных ниже примеров.
console.log(foo);
var foo;
foo = 4;
console.log(foo);

Этот код производит следующий вывод:

undefined
4

Обратите внимание, что значение было присвоено только после того, как оно прошло фактическую инициализацию в коде.

  • Давайте посмотрим, как это работает с функциями,
console.log(foo);
foo();
function foo() {
    console.log('foo');
}

Это дает следующий результат:

ƒ foo() {
 console.log(‘foo’);
}
foo

Обратите внимание на то, что foo () доступен еще до того, как он определен.

  • Рассмотрим последний пример использования let и const. Лексически объявленные переменные (с let или const) также поднимаются, но они остаются неинициализированными до тех пор, пока оператор в коде не будет оценен.
console.log(a); // undefined
console.log(b); // Uncaught ReferenceError: b is not defined
var a;
let b = 'b';

Это означает, что переменная остается в временной мертвой зоне между началом блока кода и инициализацией. Доступ к переменной в этот момент вызовет ReferenceError. Эта ошибка возникает из-за того, что объявление перемещается наверх из-за подъема, поэтому компилятор знает, что эта лексическая переменная имеет фактическое значение, которое будет инициализировано в более поздний момент времени, следовательно вместо того, чтобы показать неправильное значение, например undefined, возникает ошибка.

- На сегодня все