JavaScript

Помогите разобраться в логике кода (замыкания)

var justAVar = "Oh, don't you worry about it, I'm GLOBAL";
function whereAreYou() {
var justAVar = "Just an every day LOCAL";
function inner() {
return justAVar;
}
return inner;
}
var innerFunction = whereAreYou();
var result = innerFunction();
console.log(result);

Люди, помогите плиз. Изучаю JS по книге. В качестве примера приводится вот такой код. Разбирается тема про замыкания, если я правильно понял. Так вот в чём вопрос. Меня совсем сбивает с толку эта логика языка. Мы создали функцию whereAreYou. Затем идёт присваивание объявленной функции innerFunctio. А потом ещё зачем-то присвается это ещё одной функции result. И вот что это за хрень? Напоминает какую-то матрёшку. Раз уж на то пошло, почему бы не сделать ещё пару десятков вложений в другие переменные? Слепить этакий качан капусты)
Почему после создания функции нельзя просто написать вот так ?
console.log(whereAreYou);
ну или со скобками, как там правильно надо... А то я ещё новичёк, не всё понимаю:
console.log( whereAreYou() );
Зачем создавать эти лишние вложения ?
Разъясните пожалуйста по подробнее. Т. к. только что вдуплил, что из-за этих непонятных мне вложений, у меня не получается решать задачи. Хотя сам код я вполне читаю. Не как не вкурю, как много этих вложений надо создавать...
Замыкания позволяют захватывать из окружения локальные переменные и сохранять их после выхода кода из функции, в которой эти переменные объявлены.

function foo() {
let phrase = ", я не узнаю вас в гриме!";
return function (name) {
return name + phrase;
};
}

let bar = foo();
console.log(bar("Кеша"));
console.log(bar("Иннокентий"));
СМ
Сергей Меньшиков
73 249
Лучший ответ
Виталий Нагорный Вы не много не поняли вопрос. Я не сказал, что не понимаю тему про замыкания. Я не понимаю, для чего делать эту бесконечную вложенность? Т. е. прежде, чем вывести функцию в console.log, её присваивают переменной, ту переменную присваивают ещё одной переменной и т. д.
СМОТРИТЕ. - КОРОТКАЯ ВЕРСИЯ, ПОЛНАЯ НИЖЕ.
Кароче говоря: Мы присвоили значение второй переменной, значение первой переменной и передали значение функции, которая присвоенна этой (1) переменной, и это позволило нам получить данные этой переменной, ее СТРОКУ. А иначе мы просто получили что первая переменная эта функция А ЗНАЧЕНИЕ ЕЕ НЕ УВИДЕЛИ БЫ, СМОТРЕТЬ КАРТИНКУ.
___________________________________________________________________
ПОЛНАЯ ВЕРСИЯ.
var innerFunction = whereAreYou(); // Тут создали ПЕРЕМЕННУЮ: innerFunction и присвоили значение ФУНКЦИИ: whereAreYou();
var result = innerFunction(); // Тут создали переменную result и присвоили значение переменной innerFunction() знак " () " - круглых скобок означает что переменная передает параметры, а параметры те, которые мы ей присвоили, | Это значит что без этого знака присвоилась просто функция и ее значение, а параметры функции которые присвоенны ей не передались.
console.log(result); - Тут выводится сообщение нашего результата.

Первой переменной присвоили значение функции.
Второй переменной присвоили значение 1 переменной и передали параметры функции.
И в итоге у нас вывелась на консоль СТРОКА.
Если не присвоить значение переменной, другой переменной и не передать параметры, то мы просто получим функцию, как в первом случае на картинки. Но если мы присвоим значение первой переменной и передадим ей параметры, функции, мы получим значение строки этой функции. Как во втором случае, красным цветом выделено на консоли.
Тимур Саидов В первом случае мы получили функцию. А во втором передали значение этой функции то что внутри нее другой переменной.