Добрый день уважаемые участники сообщества.
Постепенно осваиваю сущность js-а по онлайн пособию learn.javascript.ru. Дошел до замыканий и при решении одной из задач после главы застопорился. Задача "Функция – строковый буфер" после главы "Локальные переменные для объекта" раздела "Замыкания, область видимости".
Пытался решить сам, выходило не совсем верно. потом подсмотрел образец решения и сравнил со своим. Ход мысли был верным, но вот в одном месте образец и мое решение начало расходится и после этого возник когнитивный диссонанс.
Вот код образца:
function makeBuffer() {
var text = '';
return function(piece) {
if (arguments.length == 0) { // вызов без аргументов
return text;
}
text += piece;
};
};
var buffer = makeBuffer();
// добавить значения к буферу
buffer('Замыкания');
buffer(' Использовать');
buffer(' Нужно!');
alert( buffer() ); // 'Замыкания Использовать Нужно!'
Итак уважаемые знатоки, вопрос:
Как можно правильно записать последнюю часть данного задания без присвоения вычисленного значения функции makeBuffer() переменной buffer?
Что я имею ввиду: если бы мы опустили строку с "var buffer = makeBuffer();"
как можно было бы правильным методом прийти к искомому ответу в виде "alert( makeBuffer() ) // 'Замыкания Использовать Нужно!' " ?
если сделать alert( makeBuffer() ), функция возвращает полный текст кода после return: function (piece) {...
если сделать alert( makeBuffer()() ) функция возвращает пустую строку
Alert выполняется после соответствующих вызовов makeBuffer('Замыкания') и т.д.
И еще вопрос, почему мы присваиваем переменной buffer вычисленное значение функции makeBuffer() (по идее это строка), а далее вызываем эту переменную как функцию со значением buffer('Замыкания');, судя по материалам учебника (основы js > функциональные выражения) вроде в таком случае должно быть тогда присваивание вида "var buffer = makeBuffer; "
Но даже если пусть мы присваиваем переменной buffer функцию makeBuffer(), у нас нет не 1 переменной, которые приходят в функцию в качестве аргументов. Таким образом любое значение, которое передано функции buffer('any'), не участвует в процессах внутри данной функции.
Искренне надеюсь на вашу толерантность к новичкам, и на ваш мудрый совет и помощь в разборе данного кода.