Нет! это не подъем, а воспоминание.

В течение некоторого времени я занимался исследованием того, что такое подъемный механизм, и после некоторых исследований я обнаружил, что не все ресурсы по этой конкретной концепции понятны на 100%. Вот почему я нашел время, чтобы написать эту статью таким образом, чтобы она была достаточно простой для понимания.

Приглашаем всех прочитать эту статью, но, конечно же, вы должны хорошо знать основы Javascript. Хорошо, мы наконец можем погрузиться в подробности и узнать, что такое подъемное оборудование.

Большой вопрос: что такое подъемное?

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

Давайте рассмотрим этот пример кода, чтобы он был более интуитивно понятным:

getCoffee();
console.log(x)
console.log(y)
var x = 'something....'
function getCoffee(){
console.log('get me some coffee');
}

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

Мы получаем этот результат, когда запускаем код в браузере. Я хочу, чтобы вы сосредоточились на трех вещах: первый результат, полученный функцией «getCoffee ()», неопределенный результат, полученный из консольного журнала x, и наконец, Uncaught ReferenceError: сообщение y не определено, полученное из журнала консоли y.

Давайте представим, что мы, по крайней мере, поняли функцию «getCoffee ()», а как насчет undefined, возвращаемого консольным логированием x, почему бы нам также не получить результат и не распечатать его? Хорошо, я отвечу на этот вопрос, но сначала я хочу, чтобы вы знали, что это вызвано подъемом в javascript, подъем может существовать в двух формах, а именно: частично поднято и полностью поднято.

В чем вообще их разница? Частично поднята, задает для переменной значение undefined на этапе создания. Мы можем ясно увидеть это, когда проверим объект окна. На скриншоте ниже вы уже должны увидеть, что для переменной x установлено значение undefined. Ему выделена память, но ему не присвоено значение, поэтому он автоматически устанавливает для этого значения значение undefined. Обратите внимание, что это происходит в переменных (var), но не применимо к переменным ES6, т.е. let и const.

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

Меньше, я забыл, вы вспомнили console.log (y), которая выдавала ошибку ReferenceError: y is not defined? мы получаем эту ошибку, потому что в нашем коде нет переменной с именем y, поэтому мы получаем referenceError, важно отметить, что «not defined» отличается от «undefined». Да, они разные, «не определены», как мы можем ясно видеть, подразумевает, что переменная y отсутствует или просто не существует, в то время как undefined просто означает, что переменная присутствует, но ее значение не установлено.

О, парень! это уже слишком, сделайте небольшой перерыв, и вы можете продолжить ... С возвращением! так что же на самом деле происходит за кулисами?

За кулисами

Когда происходит подъем, переменные и функции получают выделенную память на этапе создания, для переменных они получают специальное значение undefined, пока функции определены. Механизм javascript ищет два конкретных ключевых слова, если подъем должен произойти, это var и объявление функции. Если эти ключевые слова отсутствуют, мы получаем referenceError.

(function cook(){ 
  console.log('cooking....')
})
// if we try to call the cook() function we will get Uncaught ReferenceError: cook is not defined

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

Подъем происходит во всех функциях?

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

// function expression
console.log(playSong())
var playSong = function(){ console.log('playing jason derulo')}
If we try to call the function we will get an error, this is because we can only call the playSong() function after its defined

Они оба частично подняты, что означает, что они получают неопределенное значение. Но сложность заключается в том, что мы можем добиться такого поведения только в том случае, если мы console.log (playSong) и не вызываем функцию

console.log(playSong)
var playSong = function(){ console.log('playing jason derulo')}
this way we can get the exact behavior as the var variable.

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

Подъем - хорошая практика?

Давайте посмотрим на этот фрагмент кода

read()
function read(){
 console.log('I am reading some novel')
}
function read(){
 console.log('I am done reading the novel')
}
function read(){
 console.log('I am confused')
}

Какая функция возвращается? Что ж, на этапе выполнения в javascript механизм javascript считывает код снизу вверх и выделяет память для написанного кода, если у нас есть та же функция, что и выше, она будет выделять память только последнему, независимо от того, сколько раз он обнаружил ту же самую функцию. Большая проблема здесь в том, что другие функции, кроме последней, всегда будут перезаписаны, а это значит, что мы не сможем запускать другие функции. Один из лучших приемов написания хороших программ - это предсказуемость: когда вы используете подъем, вы никогда не сможете предсказать свой код. На мой взгляд, не следует писать непредсказуемые программы. Так что я скажу избегать подъема.

Обобщить

Вау, наконец-то мы закончили.

Давайте попробуем просмотреть все, что мы узнали до сих пор, во время подъема память выделяется функции или переменной, им присваивается значение, подъем может существовать в двух формах полностью и частично, все переменные, объявленные в var, частично поднимаются, а функции объявления полностью подняты. Механизм javascript ищет два ключевых слова: function и var, и, наконец, вам следует избегать подъема, потому что он перезаписывает ваш код и затрудняет предсказуемость вашей программы. Вот и все, ребята. Как всегда, не стесняйтесь присылать свои отзывы и вещи, которые, по вашему мнению, я мог бы улучшить. Приветствую и счастливого кодирования.

Вдохновение основано на Javascript: продвинутая концепция Андрея Негойи, основателя концепции от нуля до мастерства.