Объяснение подъема в 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. Спасибо.