JavaScript - еще одна прекрасная часть, которая заставляет нас любить язык.

Когда дело доходит до подъема, это большую часть времени сбивает нас с толку. Это один из любимых вопросов интервьюера. Итак, сегодня мы попытаемся понять подъем на простом языке непрофессионала.

Давайте начнем с некоторого JS-кода, чтобы понять подъем.

// JS Hoisting
var m = 10;
function miniScript() {
  console.log(“miniScript is exploring JS”);
}
// Let's invoke the functions and variables 
miniScript();
console.log(m);

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

Так что это все, что мы знаем, но большой вопрос, что такое подъем?

Чтобы понять это, давайте изменим фрагмент кода, который мы написали выше.

//Call the function and variables even before we declaring them.
console.log(m);
miniScript();
function miniScript() {
  console.log(“miniScript is exploring JS”);
}
var m = 10;

что вы должны думать о результатах этого?

Большая часть языка программирования выдаст здесь ошибку, потому что мы пытаемся запустить функции, которых к тому времени даже не существовало.

Но в этом прелесть JavaScript, которая заставляет нас любить его больше, когда мы исследуем его более глубоко.

Это результат приведенного выше фрагмента кода.

Результатом будет var m = undefined, и мы получим правильное значение для функции miniScript (). Это все из-за Hoisting. На непрофессиональном языке определение подъема будет выглядеть следующим образом:
Подъем в JavaScript - это доступ к переменным и функциям даже до их объявления или инициализации без каких-либо ошибок.

Итак, большой вопрос, как движок JavaScript это делает?
Давайте поместим отладчик в первую строку кода и остановим браузер, чтобы выполнить код и углубиться в него.
Я прилагаю запись экрана помещения отладчика в первую строку кода

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

Теперь, если мы console.log завершим нашу функцию, вы увидите, что произойдет что-то интересное.

// Let's see how our function will look in Global scope before executing. 
console.log(miniScript);
function miniScript() {
   console.log("miniScript is exploring JS");
}

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

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

// Arrow function behave like variables. 
console.log(miniScript);
var miniScript = () => {
   console.log("miniScript is exploring JS");
}

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

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

Все это происходит из-за Hoisting.
В следующий раз, если кто-то спросит вас о подъеме - подъем присваивает память переменным и функциям еще до их инициализации.

Давайте углубимся глубже и посмотрим, что произойдет в случае let и const?

// Use case for let or Const - I am using const 
console.log(m);
const m = 'miniScript';

Как думаете, что будет на выходе? они будут вести себя так же, как var или функции?
посмотрим….

Ответ немного сложнее. Вы можете видеть, что мы получили ошибку «Uncaught ReferenceError: Невозможно получить доступ к« m »до инициализации». Это означает, что мы не можем получить доступ к переменной до инициализации, но, как вы можете видеть в областях, у нас есть еще одна локальная область, называемая Script, в которой наша переменная "m" и его значение не определено. Так что это значит?
Это означает, что let и const не относятся к глобальным областям действия. Они создают свою собственную локальную область поверх глобальной области.

Это называется временной мертвой зоной. Если вы попытаетесь получить доступ к этим переменным из мертвой зоны, вы получите эталонную ошибку. Но с точки зрения Подъема const и пусть память и заполнитель не определены. а это значит, что они тоже подняты.

Итак, это все о подъеме JavaScript. Я постарался сделать это простым и попытаться объяснить, что происходит под капотом. Как движок JavaScript выделяет память и поднимает переменные.

Если вам понравился этот пост, поставьте мне лайк. Это побудит меня написать еще один пост простым языком непрофессионала.

Написано с любовью ❤️ ‹miniScript /› на моем столе во время создания магазинов электронной коммерции с Anatta.