2015-08-23 3 views
1

Вдохновленный If Hemingway Wrote Javascript, я пытаюсь написать замыкающее замыкание функции с частной локальной переменной.Javascript Chainable Closure

Намеченный поведение:

> chainableCounter() 
0 
> chainableCounter(1)(2)() 
3 

Вот мой код:

function chainableCounter(n) { 
    var acc = 0; 

    var fn = function (x) { 
     if (x === undefined) { 
      return acc; 
     } else { 
      acc = acc + x; 
      return fn; 
     } 
    }; 

    fn(n); 
} 

Когда я пытаюсь запустить это в РЕПЛ узла, это то, что я получаю:

> chainableCounter() 
undefined 
> chainableCounter(1) 
undefined 
> chainableCounter(1)() 
TypeError: undefined is not a function 

То, что chainableCounter(1) возвращает undefined вместо объекта функции, указывает на то, что мы никогда не ударяем строка return fn;. Но более того, почему chainableCounter() также возвращается undefined, когда он должен вернуться 0? Что мне не хватает?

+0

Вы хотите, чтобы функция возвращала функцию. Попробуйте изменить последнюю строку из 'fn (n);' to 'return fn;'. –

+0

@jordan, fn возвращает себя при вызове, и он хочет, чтобы он вызвал с arg в chainableCounter. Но возвратная часть права. – z5h

+0

Вам нужно 'chainableCounter' вернуть функцию. –

ответ

2

fn(n) возвращается в пункт вызова. Ваша действительная функция chainableCounter ничего не возвращает, у нее нет оператора возврата.

Вы можете просто добавить его перед вызовом fn, как это:

return fn(n); 
2

Должно быть

return fn(n);

Поскольку JavaScript необходим явный оператор возврата.

Смежные вопросы