Знаете ли вы о подъеме функций и переменных в JavaScript?

«Простой» вопрос по JavaScript

Джон, фронтенд-инженер нашей компании, хочет найти нового коллегу. Недавно он проинтервьюировал около 100 претендентов на работу. Он задал им тот же вопрос по JavaScript. К сожалению, 90% кандидатов ответили на него неправильно.

Я спросил Джона: «Что это за вопрос? так сложно?»

«Ну, на самом деле это совсем не сложно», — ответил Джон с улыбкой, а затем показал мне вопрос для интервью:

// you know, I change the code for my ad. :)

var followImDodd = function () {
 console.log("please follow Stackademic, it is so interesting!");
}
followImDodd();
var followImDodd = function () {
 console.log("please follow imdodd, he is so interesting!");
}
followImDodd();
function followImDodd() {
 console.log("please follow Stackademic, it is so interesting!");
}
followImDodd();
function followImDodd() {
 console.log("please follow imdodd, he is so interesting!");
}
followImDodd();

Я нашел вопрос очень интересным. Некоторое время. Я дал свой ответ:

please follow Stackademic, it is so interesting!
please follow imdodd, he is so interesting!
please follow Stackademic, it is so interesting!
please follow imdodd, he is so interesting!

Джон усмехнулся и сказал: «Ну, похоже, тебя тоже исключили».

Я был озадачен. "Почему? Разве ответ не правильный?».

«Это не совсем правильно. Позвольте мне объяснить», — сказал он.

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

Во-первых, Джон указал на код первых двух функций.

var followImDodd = function () {
 console.log("please follow Stackademic, it is so interesting!");
}
followImDodd();
var followImDodd = function () {
 console.log("please follow imdodd, he is so interesting!");
}
followImDodd();

«В целом большинство собеседников, как и вы, могут правильно ответить на эту часть»

please follow Stackademic, it is so interesting!
please…