Edit in JSFiddle

(function () {
    // Douglas Crockford's solution which makes the code
    // totally unreadable because of the mutual recursion
    function memoizer(memo, formula) {
        var recur = function (n) {
            var result = memo[n];

            if (typeof result !== 'number') {
                result = formula(recur, n);
                memo[n] = result;
            }

            return result;
        };

        return recur;
    }

    var factorial = memoizer([1, 1], function (recur, n) {
        return n * recur(n - 1);
    });
})();

(function () { // my solution
    function memoizer(formula) {
        var recur = function (n) {
            if (typeof formula[n] !== 'number') {
                formula[n] = formula(n);
            }

            return formula[n];
        };

        return recur;
    }

    var factorial = memoizer(function factorial(n) {
        if (n === 1) return n;

        return n * factorial(n - 1);
    });
})();