JackShcherbakov
@JackShcherbakov

Что за странная передача аргумента?

Добрый вечер, уважаемые программисты.

Не совсем понятно, хоть и кучу всего перерыл, каким образом компилятор работает с этим кодом:
function makeBuffer() {
  var text = '';

  return function(piece) {  /* <-- (*) */
    if (arguments.length == 0) { // вызов без аргументов
      return text;
    }
    text += piece;
  };
};

var buffer = makeBuffer();

// добавить значения к буферу
buffer('Замыкания');  /* <-- (**) */
buffer(' Использовать');
buffer(' Нужно!');
alert( buffer() ); // 'Замыкания Использовать Нужно!'

var buffer2 = makeBuffer();
buffer2(0);
buffer2(1);
buffer2(0);

alert( buffer2() ); // '010'

В строке (*) мы внутренней (не внешней) функции передаем параметр piece, но в строке (**) мы, передав внешнюю, основную функцию переменной buffer, передаем внешней функции аргумент.
Как так-то? Почему параметр у внутрененй, а аргумент у внешней.
Буду безумно благодарен за ссылки на ресурсы и ваши разъяснения!

Заранее выражаю огромную благодарность!
  • Вопрос задан
  • 252 просмотра
Решения вопроса 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Функция makeBuffer() не вызывает описанную внутри неё безымянную функцию, она возвращает её саму (а не её значение) в качестве результата.
При этом, за счёт замыкания, каждая возвращённая функция работает с отдельной копией глобальной переменной text.
Ответ написан
alvvi
@alvvi
export default apathy;
(**) мы, передав внешнюю,

Не знаю, как там вы, но js никуда ничего не передавал, в buffer был присвоен результат вызова функции makeBuffer - другая, анонимная функция, в строке (**) мы ее успешно вызвали, она воспользовалась [[Scope]] присвоенным ей при вызове makeBuffer и радостно сконкатенировала строки, а потом вернула их в alert
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы