Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   помогите понять (https://javascript.ru/forum/events/28787-pomogite-ponyat.html)

cyber 04.06.2012 18:29

продолжаю изучение по учебнику http://learn.javascript.ru и снова столкнулся с проблемой и вот в этой
http://learn.javascript.ru/using-closures
статье есть задача для самостоятельного решения вот задача
http://learn.javascript.ru/task/funk...trokovyj-bufer
и все ок задачу решил он не сложная но сначала все работало , а потом вместо результат начало возвращать содержимое тела функции
function makeBuffer() {
var buff = "";

  return function (param){
  if(!param)return buff;
   
    buff += param;
    
  }

}

var buffer = makeBuffer();

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

помогите понять почему так?

Раед 04.06.2012 18:35

function makeBuffer() {
var buff = "";
 
  return function (param){
  if(!param)return buff;
    
    buff += param;
     
  }
 
}
 
var buffer = makeBuffer();
 
// добавить значения к буферу
buffer('Замыкания');
buffer(' Использовать');
buffer(' Нужно!');
// получить текущее значение
alert(buffer*!*()*/!*);

cyber 04.06.2012 18:42

Цитата:

Сообщение от Раед (Сообщение 178859)
function makeBuffer() {
var buff = "";
 
  return function (param){
  if(!param)return buff;
    
    buff += param;
     
  }
 
}
 
var buffer = makeBuffer();
 
// добавить значения к буферу
buffer('Замыкания');
buffer(' Использовать');
buffer(' Нужно!');
// получить текущее значение
alert(buffer*!*()*/!*);

ой протупил, пасиб :)

cyber 04.06.2012 18:50

и еще маленький вопрос
зачем в это коде
function summ (a)
      {
      var summa = a ;
      
        function f(b){
  	  summa += b;    
      return f;
        };
        f.toString = function() { return summa; };
       return f; 
      };
   alert(summ (5)(3)(-8))

строчка
f.toString = function() { return summa; };

и когда он срабатывает?

Раед 04.06.2012 18:56

Метод toString вызывается автоматически, когда необходимо привести объект к строке.
В данном случае alert(summ (5)(3)(-8)) - это сокращённая запись alert(summ (5)(3)(-8).toString())

cyber 04.06.2012 19:04

Цитата:

Сообщение от Раед (Сообщение 178876)
Метод toString вызывается автоматически, когда необходимо привести объект к строке.
В данном случае alert(summ (5)(3)(-8)) - это сокращённая запись alert(summ (5)(3)(-8).toString())

:thanks:

cyber 06.06.2012 19:25

дошел до последней главы функций и на удивление благодаря вашим подсказкам много нового узнал=)
но возник вопрос по последнему уроку Декораторы
http://learn.javascript.ru/decorators
вот к примеру есть код
function work(a) { 
  /* ... */ // work - произвольная функция, один аргумент
}

function makeLogging(f, log) {

  return function (a){
  
 log.push(a);
  f.call(null,a);  
  
  }

}

var log = [];
work = makeLogging(work, log);

work(1); // 1, добавлено в log
work(5); // 5, добавлено в log

for(var i=0; i<log.length; i++) {
  alert( 'Лог:' + log[i] ); // "Лог:1", затем "Лог:5"
}

в общем код просто но вот чего не могу понять
return function (a){
  
 log.push(a);// это понятно добавление в массив лог
   return f.call(null,a);  // но смысел от этой сточки? и без нее работает
  
  }

вот код решение задачи из учебника (выше это мое ришение)
function work(a) { 
  /*...*/ // work - произвольная функция, один аргумент
}

function makeLogging(f, log) {

function wrapper(a) {
    log.push(a);
    return f.call(this, a);   
  }

  return wrapper;
}

var log = [];
work = makeLogging(work, log);

work(1); // 1
work(5); // 5

for(var i=0; i<log.length; i++) {
  alert( 'Лог:' + log[i] ); // "Лог:1", затем "Лог:5"
}

Раед 06.06.2012 19:34

Цитата:

Сообщение от cyber
return f.call(null,a); // но смысел от этой сточки? и без нее работает

Ну дык она же функцию вызывает. Без неё весь смысл декораторов теряется.

cyber 06.06.2012 19:40

Цитата:

Сообщение от Раед (Сообщение 179508)
Ну дык она же функцию вызывает. Без неё весь смысл декораторов теряется.

не ну это я понимаю:yes:
но в данном примере нет смысла от нее так как функция пустая?=)

Раед 06.06.2012 19:58

Цитата:

Сообщение от cyber
но в данном примере

Вот именно, это всего лишь пример и функция может быть любой
Цитата:

Сообщение от cyber
work - произвольная функция



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