Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.08.2015, 13:10
Новичок на форуме
Отправить личное сообщение для kriolis Посмотреть профиль Найти все сообщения от kriolis
 
Регистрация: 28.08.2015
Сообщений: 5

Не работают коментарии к учебнику, пишу сюда
Добрый день уважаемые участники сообщества.
Постепенно осваиваю сущность 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'), не участвует в процессах внутри данной функции.

Искренне надеюсь на вашу толерантность к новичкам, и на ваш мудрый совет и помощь в разборе данного кода.

Последний раз редактировалось kriolis, 28.08.2015 в 13:23.
Ответить с цитированием
  #2 (permalink)  
Старый 28.08.2015, 13:43
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от kriolis Посмотреть сообщение
Как можно правильно записать последнюю часть данного задания без присвоения вычисленного значения функции makeBuffer() переменной buffer?
var makeBuffer = function() {
  var text = '';
 
  return function(piece) {
    if (arguments.length == 0) {
      return text;
    }
    text += piece;
  };
}();
makeBuffer('Замыкания');
makeBuffer(' Использовать');
makeBuffer(' Нужно!');
alert( makeBuffer() );

Сообщение от kriolis Посмотреть сообщение
судя по материалам учебника (основы js > функциональные выражения) вроде в таком случае должно быть тогда присваивание вида "var buffer = makeBuffer; "
На выходе имеем:
// text в замыкании 
var buffer = function(piece) {
    if (arguments.length == 0) {
      return text;
    }
    text += piece;
};
Ответить с цитированием
  #3 (permalink)  
Старый 28.08.2015, 14:02
Новичок на форуме
Отправить личное сообщение для kriolis Посмотреть профиль Найти все сообщения от kriolis
 
Регистрация: 28.08.2015
Сообщений: 5

Сообщение от Rise Посмотреть сообщение

На выходе имеем:
// text в замыкании 
var buffer = function(piece) {
    if (arguments.length == 0) {
      return text;
    }
    text += piece;
};
По этому куску все встало на свои места, спасибо. А вот по первой части можете мне пояснить "var makeBuffer = function() {...}();" откуда эти скобки 2-ые вылезают, какую роль они выполняют? Если есть источник информации по этой теме с не очень заковыристым языком, буду только рад ознакомится самостоятельно.
Ответить с цитированием
  #4 (permalink)  
Старый 28.08.2015, 14:08
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

kriolis, "вычисленное значение функции" криво звучит, функция возвращает значение и либо явно (указан return, что справа от return то и вернет), либо не явно (return не указан, тогда вернет undefined).
Ответить с цитированием
  #5 (permalink)  
Старый 28.08.2015, 14:18
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,121

Сообщение от kriolis
А вот по первой части можете мне пояснить "var makeBuffer = function() {...}();" откуда эти скобки 2-ые вылезают, какую роль они выполняют?
Иллюстрация...

var tmp;
tmp=function(){alert(1)};
tmp();
tmp=function(){alert(2)}();
(function(){alert(3)})();
Ответить с цитированием
  #6 (permalink)  
Старый 28.08.2015, 14:25
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от kriolis Посмотреть сообщение
откуда эти скобки 2-ые вылезают, какую роль они выполняют?
Обычный вызов функции - объявили анонимную функцию тут же на месте ее вызвали она вернула другую функцию которая присвоилась в переменную и как бонус text замкнула) читай следующую главу про модули короче)
Ответить с цитированием
  #7 (permalink)  
Старый 28.08.2015, 14:48
Новичок на форуме
Отправить личное сообщение для kriolis Посмотреть профиль Найти все сообщения от kriolis
 
Регистрация: 28.08.2015
Сообщений: 5

Спасибо буду дальше читать, и погуглю, что такое анонимная функция. От вашего комментария повеяло эпизодом одного художественного фильма, если вы понимаете о чем я

Последний раз редактировалось kriolis, 28.08.2015 в 15:18.
Ответить с цитированием
  #8 (permalink)  
Старый 28.08.2015, 15:36
Новичок на форуме
Отправить личное сообщение для kriolis Посмотреть профиль Найти все сообщения от kriolis
 
Регистрация: 28.08.2015
Сообщений: 5

Перечитал еще раз главу с замыканиями [[scope]] LE, и, наконец-то, я понял что к чему спасибо за ваши ответы! И про этот хитрый вызов функции с последующим ее же выполнением тоже вроде как дошел
С тем кусочком первым получается что-то вроде этого:
//var text = ''; переменная уходит в замыкание
// а переменной makeBuffer присваиваем то, что она же возвращает при ее вызове
var makeBuffer = function(piece) {
    if (arguments.length == 0) {
      return text;
    }
    text += piece;
  };
};
makeBuffer('Замыкания');
makeBuffer(' Использовать');
makeBuffer(' Нужно!');
alert( makeBuffer() );
Ответить с цитированием
  #9 (permalink)  
Старый 29.08.2015, 12:05
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Цитата:
// а переменной makeBuffer присваиваем то, что она же возвращает при ее вызове
Нет, переменной makeBuffer присваиваем то, что возвращает анонимная функция при своем вызове в момент присваивания.
Ответить с цитированием
  #10 (permalink)  
Старый 29.08.2015, 18:12
Новичок на форуме
Отправить личное сообщение для kriolis Посмотреть профиль Найти все сообщения от kriolis
 
Регистрация: 28.08.2015
Сообщений: 5

ну да, смысл был этот, но с правильной формулировкой пока что плоховато
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск