Подъем, с точки зрения непрофессионала, - это способ перемещения переменных (объявленных с использованием ключевого слова 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, возникает ошибка.
- На сегодня все