JavaScript のインスペクトで末尾再帰のループ展開

if (typeof Object.create !== 'function') {
    Object.create = function (o) {
        var F = function () {};
        F.prototype = o;
        return new F();
    };
}

var thunk = {
    cookie: {}
};

var make_thunk = function (func, args) {
    c = Object.create(thunk);
    c.force = function (cookie) {
        return func.apply(null, args);
    };
    return c;
};

var loop_ex = function (func) {
    var f = function () {
        if (f.caller &&
            f.caller.caller &&
            f.caller.caller.arguments[0] === thunk.cookie) {

            return make_thunk(func, arguments);
        } else {
            c = make_thunk(func, arguments);
            while (c.cookie === thunk.cookie) {
                c = c.force(thunk.cookie);
            }
            return c;
        }
    };
    return f;
};

var fact = function (n, acc) {
    if (n > 0) {
        return fact(n - 1, n * acc);
    } else {
        return acc;
    }
};

fact = loop_ex(fact);

document.writeln(fact(5, 1));

JavaScript: The Good Parts 流のオブジェクト指向のやりかたはこんな感じでいいのか?