一个方法不会“记住”它的所有者(它的this);您可以将方法从一个对象复制到另一个对象,并像对待任何其他函数一样对待它。只有当您使用点符号实际调用它时,它才具有正确的所有者,例如this.doWork().
所以你的问题是你将函数传递this.doWork给setTimeout,然后它在不知道它的所有者的情况下作为一个函数被调用,突然它this而window不是你的计时器对象。要解决此问题,您需要跟踪this自己。例如,你可以写:
Test.Timers = (function () {
    var newTimer = {
        c: null,
        startTimer: function() {
            this.c = 0;
            setTimeout(function () { newTimer.doWork(); }, 0);
        },
        doWork: function() {
            this.c++;
            alert(this.c);
            setTimeout(function () { newTimer.doWork(); }, 0);
        }
    };
    return newTimer;
 })();
或者:
Test.Timers = (function () {
    var startTimer = function() {
        newTimer.c = 0;
        setTimeout(doWork, 0);
    };
    var doWork = function() {
        newTimer.c++;
        alert(newTimer.c);
        setTimeout(doWork, 0);
    };
    var newTimer = {
        c: null,
        startTimer: startTimer,
        doWork: doWork
    };
    return newTimer;
 })();
(注意,我也改成c了this.cor newTimer.c,因为你的版本重复引用window.c。还要注意,在第二个版本中,如果你不需要外部代码就可以访问c,你可以将其更改为局部变量,使得东西更干净。)