Объяснение подъема в JavaScript

Поднятие — уникальная особенность JavaScript, позволяющая использовать переменные и функции еще до того, как они будут объявлены. В большинстве других языков программирования вызов переменной или функции перед объявлением приведет к ошибке.

Переменный подъем.

Переменный подъем с вар.

console.log(x);  //The output is undefined
var x=17;

Вы не получите ошибку в качестве вывода. Вместо этого вы получаете undefined.

Здесь память была выделена для переменной, но она просто еще не инициализирована, но вы можете вызвать переменную без каких-либо ошибок. Это переменный подъем.

По сути, движок JavaScript создает глобальный контекст выполнения, который состоит в основном из двух фаз.

  • Создание памяти
  • Исполнение

Итак, сначала JavaScript выделяет память для всех переменных и функций в программе. Прежде чем переменной будет присвоено значение или она будет инициализирована, значением по умолчанию будет «undefined».

var a;  //memory allocated
console.log(a); // undefined
a = 17;  //var intialised
console.log(a); // Output is 17

Здесь, во второй строке, мы получаем «undefined», потому что переменная a поднимается и получает значение по умолчанию undefined. Переменная a инициализируется в третьей строке, поэтому при выполнении четвертой строки мы получаем результат 17. Но если мы console.log необъявленную переменную, она выдает ошибку ссылки (не определено), потому что объявление не поднято.

console.log(b); // ReferenceError: b is not defined

Переменный подъем с let и const

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

console.log(a); // ReferenceError: Cannot access 'a' before initialization

let a = 10;


console.log(b); //ReferenceError: Cannot access 'b' before initialization

const b = 10;

Поскольку b объявлен с константой, ему нельзя переназначить новое значение после его объявления.

Причина, по которой возникает ReferenceError, связана с временной мертвой зоной.

Что такое временная мертвая зона?

Временная мертвая зона — это зона, в которой переменные недоступны до их инициализации. Это область видимости, в которой переменная объявлена, но к ней нельзя получить доступ или использовать ее. Если мы попытаемся получить доступ к таким переменным, мы получим ReferenceError. Практически каждая переменная let и const подвергается временной мертвой зоне. TDZ начинается в начале области, охватывающей переменную, и заканчивается, когда она объявлена.

{
    //var b is going to have a TDZ
    let a =10;
    console.log(a); // 10

    console.log(b);  //ReferenceError: Cannot access 'b' before initialization 'b' is in TDZ
    let b = 20;  // 'b' is now out of TDZ
    console.log(b);  //20 
}

Функция подъема

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

greet();  // Hey, welcome to my blog

function greet(){
console.log("Hey, welcome to my blog");
}

В приведенном выше примере функция greet() выводит «Привет, добро пожаловать в мой блог», несмотря на то, что она вызывается перед объявлением функции.

Важно отметить, что выражения не поднимаются. т. е. если вы назначаете функцию var , она не поднимается. Когда мы вызываем переменную, которой было присвоено функциональное выражение, мы получим TypeError или ReferenceError, в зависимости от области действия переменной.

greet();  //TypeError: greet is not a function

var greet() = function {
console.log("Hey, welcome to my blog");
}
greet();  //ReferenceError: Cannot access 'greet' before initialization
let greet = function(){
console.log("Hey, welcome to my blog");
}
greet();  //ReferenceError: Cannot access 'greet' before initialization
const greet = function(){
console.log("Hey, welcome to my blog");
}

Точно так же стрелочные функции также не поддерживаются в JavaScript.

greet();  //TypeError: greet is not a function
var  greet = () => {
    console.log('Welcome to my blog');
  }

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

Надеюсь, эта статья помогла вам понять подъем в JavaScript. Спасибо.