一个方法不会“记住”它的所有者(它的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.c
or newTimer.c
,因为你的版本重复引用window.c
。还要注意,在第二个版本中,如果你不需要外部代码就可以访问c
,你可以将其更改为局部变量,使得东西更干净。)