Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   пример с замыканием (https://javascript.ru/forum/misc/31990-primer-s-zamykaniem.html)

xfreewindx 28.09.2012 15:01

пример с замыканием
 
Здравствуйте!
Вкуриваю пример про строковый буфер.
function makeBuffer() {
  var text = ''; 
    
  return function(piece) {
    if (piece === undefined) {
      return text;
    }
    text += piece; 
  };
};

var buffer = makeBuffer();

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

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

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


Поясните два момента
1. почему мы присваиваем var buffer = makeBuffer();
почему нельзя просто вызывать makeBuffer('параметр'), не используя переменную buffer.
2. как передается параметр в функцию?
функция объявлена без параметра function makeBuffer() в скобках пусто,
а вызов идет с параметром buffer('Замыкания');
Пробовал вызвать makeBuffer('значение') не работает.

Skipp 28.09.2012 15:09

function a(){
return function(){ return 1 }
}
alert(typeof a());
alert(a()());

xfreewindx 28.09.2012 15:23

разобрался сам, потом прочитал ваши комменты.
Спасибо.

dmitry111 28.09.2012 15:33

Пару дней назад задавал этот же вопрос :)

Самому не понятна логика работы скрипта, хотя сама суть работы ясна.
Я привык что функция должна явно вызываться в скрипте.
makeBuffer();

И если такого вызова нет, то внутренняя часть функции остается недоступной.
Вот эта строчка:
var buffer = makeBuffer();

сбивала с толку
Это присвоение результата выполнения функции makeBuffer(), а не присвоение функции makeBuffer().

Skipp 28.09.2012 15:37

Цитата:

Сообщение от dmitry111
Это присвоение результата выполнения функции makeBuffer(), а не присвоение функции makeBuffer().

Что-то я не припомню не один язык где таким образом присваивалась бы функция, а не возвращаемое значение:)
Если бы было бы вот так:
var buffer = makeBuffer;

dmitry111 28.09.2012 15:40

Цитата:

Сообщение от Skipp (Сообщение 207040)
Что-то я не припомню не один язык где таким образом присваивалась бы функция, а не возвращаемое значение:)
Если бы было бы вот так:
var buffer = makeBuffer;

не, ну я еще зеленый совсем :)

dmitry111 28.09.2012 16:58

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 207050)
Я кстати что-то тоже..

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

а так бы тоже - не припомнил бы (

dmitry111 28.09.2012 17:00

А где практически можно было бы использовать замыкание?
Может есть у кого примеры?
Выложите пжалуйста :)

dmitry111 28.09.2012 17:52

Цитата:

Сообщение от Maxmaxmахimus (Сообщение 207072)
ОП чем тебе не пример?

ну да, неплохой пример..


Часовой пояс GMT +3, время: 12:18.