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

Сначала давайте рассмотрим несколько примеров, чтобы понять концепцию подъема.

var name;
console.log(name); //Returns 'undefined' from hoisted var declaration
name="mayank"
console.log(num); // Returns 'undefined' from hoisted var declaration (not 10)
var num = 10; // Initialization and declaration.
console.log(num); // Returns 10 after the line with initialization is executed.
fun();
function fun(){
  console.log("Hello from the fun");  // Returns Hello from the fun
}

Теперь мы рассмотрели несколько примеров и на основе этих примеров давайте поймем концепцию подъема. но сначала, что на самом деле означает подъем.

Переход наверх не означает, что переменные/функции буквально перемещаются в верхнюю часть области видимости, это просто базовое понимание, но на самом деле это неправильно.

на самом деле контекст выполнения играет здесь роль, когда начинается контекст выполнения, он состоит из двух фаз: этап создания и этап выполнения.

На этапе создания происходит выделение памяти для переменных, и если переменная объявлена ​​с ключом var, то ей присваивается специальное значение undefined.

а затем выполнение происходит на этапе выполнения, и он просто печатает значение.

‹в сторону› 💡 JavaScript поднимает только объявления, а не инициализации!

теперь вернемся к примерам и попробуем понять подъем в случае объявления переменных.

console.log(num); // Returns 'undefined' from hoisted var declaration (not 10)
var num = 10; // Initialization and declaration.
console.log(num); // Returns 10 after the line with initialization is executed.

в этом случае, как только сначала создается контекст выполнения, переменная num выделяется в памяти и инициализируется специальным значением undefined.

а затем начинает выполнение, когда выполняется первая строка, значение не определено, затем num инициализируется значением 10 во второй строке, а в 3-й строке печатается значение 10. так что теперь вы поняли, как это работает в случае переменных, объявленных с помощью ключевого слова var, одна вещь Имейте в виду, что для let и const это не работает так же, как мы увидим позже в этом видео.

Теперь давайте разберемся с подъемом функций. Это примерно то же самое, что и в случае с переменными.

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

Давайте посмотрим на это также с помощью примера

fun();
function fun(){
  console.log("Hello from the fun");  // Returns Hello from the fun
}

поэтому в этом примере контекст выполнения создает память для функции и помещает в нее все объявление функции fun.

и фаза выполнения выполняет функцию

Помещение всего объявления функции в память на этапе создания называется Function Hoisting.

fun();
var fun = function() {
  console.log("Hello from the fun");  
}
//returns error: Uncaught TypeError: fun is not a function

Но почему мы получаем ошибку в этом коде🤷‍♂️ причина в том, что здесь функция не поднимается, а присваивается переменной, и эта переменная поднимается, и когда переменная поднимается, в этом случае имя переменной перемещается в верхнюю часть текущей области, а не в присваивание, которое полностью отличается в случае подъема функции. Когда объявление функции поднимается, все тело функции перемещается в верхнюю часть текущей области, поэтому в этом случае веселье обрабатывается как переменная, объявленная с помощью var, и перед выполнением строк 2 и 3 fun равна undefined, поэтому мы получаем эту ошибку. fun не является функцией, поскольку мы пытаемся вызвать переменную, которая не является функцией

для этого есть причина, и это то, что JavaScript поднимает только объявления, а не инициализации!

прежде чем закончить это видео, давайте посмотрим, чем подъем переменной с помощью let и const отличается от переменной, объявленной с помощью ключевого слова var. переменные let и const также поднимаются, но в отличие от var здесь нет значения инициализации по умолчанию.

ссылочная ошибка будет выдана, если переменная, объявленная с помощью let и const, будет прочитана до ее инициализации.

давайте посмотрим на это на примере.

console.log(num); // error: Uncaught ReferenceError: Cannot access 'num' before initialization
let num = 10; // Initialization and declaration.
console.log(num); // error: Uncaught ReferenceError: Cannot access 'num' before initialization
const num = 10; // Initialization and declaration.

есть одна концепция, известная как Временная мертвая зона, давайте разберемся с ней только здесь.

Временная мертвая зона — это поведение в JavaScript, возникающее при объявлении переменной с ключевыми словами let и const, но не с var. В ECMAScript 6 доступ к переменной let или const до ее объявления (в пределах ее области действия) вызывает ошибку ReferenceError. Промежуток времени, когда это происходит, между созданием привязки переменной и ее объявлением, называется временной мертвой зоной.