Привет, Сомнат.
Вы объяснили, как происходит явление подъема, но не почему. Для какой цели он вообще существует в JS, и какова причина самого ключевого слова VAR.
На мой взгляд, JS — это не совсем ООП-язык и не совсем функциональное программирование. Он ориентирован на использование в ущерб логической ментальной модели любого Пользователя. Вот почему это так трудно понять. Основным шаблоном использования функций и областей видимости является clojure, который повсеместно используется в JS-программировании и является очень мощным, но он не подходит с точки зрения изменчивости. Что очень плохо для функционального программирования как такового. Предположим, у вас есть код:
а = Намасте
функция б() {
var c = человек
возврат () =› а + с
}
console.log(b()());
Он отлично работает, получая доступ к clojure, как и ожидалось. NB: var c недоступен никаким образом, кроме нашего обратного обратного вызова. Но жизнь сложна. Что, если в нашей дальнейшей программе с переменной а случится что-то нехорошее, например, удалить а, или мы просто выйдем за область действия а? Так:
а = Намасте
функция б() {
var c = человек
возврат () =› а + с
}
удалить а;
console.log(b()());
Наш код дает сбой, пользователь ничего не получает в качестве вывода, что совершенно недопустимо для пользовательского интерфейса, пользователь может даже не интересоваться выводом cb, но код дает сбой, и пользователь вообще ничего не видит.
Но если мы поместим var перед свойством a, она станет неудаляемой локальной переменной, и код все равно будет работать. Он не рухнет, даже если выйдет за пределы области видимости или поместит свое объявление в саму функцию:
функция б() {
var c = человек
возврат () =› а + с
}
вар а = Намасте
удалить а;
console.log(b()());
Все еще работает, как ожидалось. Худшее, что может случиться — плодить ерунду типа undefined Human, но хотя бы не грохнуться перед лицом Пользователя.
Я думаю, что это настоящая суть ключевого слова var в JS.