Не работают коментарии к учебнику, пишу сюда
Добрый день уважаемые участники сообщества.
Постепенно осваиваю сущность 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'), не участвует в процессах внутри данной функции. Искренне надеюсь на вашу толерантность к новичкам, и на ваш мудрый совет и помощь в разборе данного кода. :help: |
Цитата:
|
Цитата:
var tmp; tmp=function(){alert(1)}; tmp(); tmp=function(){alert(2)}(); (function(){alert(3)})(); |
Спасибо :) буду дальше читать, и погуглю, что такое анонимная функция. От вашего комментария повеяло эпизодом одного художественного фильма, если вы понимаете о чем я :)
![]() |
Перечитал еще раз главу с замыканиями [[scope]] LE, и, наконец-то, я понял что к чему :) спасибо за ваши ответы! И про этот хитрый вызов функции с последующим ее же выполнением тоже вроде как дошел :)
С тем кусочком первым получается что-то вроде этого: //var text = ''; переменная уходит в замыкание // а переменной makeBuffer присваиваем то, что она же возвращает при ее вызове var makeBuffer = function(piece) { if (arguments.length == 0) { return text; } text += piece; }; }; makeBuffer('Замыкания'); makeBuffer(' Использовать'); makeBuffer(' Нужно!'); alert( makeBuffer() ); |
ну да, смысл был этот, но с правильной формулировкой пока что плоховато
|
Цитата:
Цитата:
|
Часовой пояс GMT +3, время: 17:41. |