一个方法不会“记住”它的所有者(它的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,你可以将其更改为局部变量,使得东西更干净。)