Привет, Сомнат.

Вы объяснили, как происходит явление подъема, но не почему. Для какой цели он вообще существует в 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.