js-study-part4-task4

by tigeral

HTML

<!--
Написать ф-цию factorial, которая бы кешировала уже вычисленные значения, и если на вход попадает аргумент, для которого уже есть закешированный результат - возвращать сразу из кеша без вычислений.
-->

JavaScript

var factorial = function () {
  var cache = {};
  return inner;

  function inner(n) {
    var result = cache[n] || assertIsNonNegativeInt(n);
    if (!result) {
      for (var i = result = 1; i <= n; i++) {
        result *= i;
      }
      console.log('put ' + n + '! = ' + result + ' to cache');
      cache[n] = result;
    }
    return result;

    function assertIsNonNegativeInt(n) {
      if (Number.isSafeInteger(n) && n >= 1) {
        return 0;
      } else {
        throw TypeError('Parameter must be a non-negative integer number');
      }
    }
  }
}();

console.log(factorial(1));
console.log(factorial(3));
console.log(factorial(3));
console.log(factorial(-3));