Une méthode ne "se souvient" de son propriétaire (son this
); vous pouvez copier une méthode d'un objet à un autre et la traiter comme n'importe quelle autre fonction. Il n'a le bon propriétaire que lorsque vous l'appelez en utilisant la notation par points, par ex. this.doWork()
.
Donc, votre problème est que vous passez la fonction this.doWork
-setTimeout
, puis il est appelé en fonction sans connaître son propriétaire, et tout à coup son this
est window
au lieu de votre objet de la minuterie. Pour résoudre ce problème, vous devez garder une trace de votre this
. Par exemple, vous pouvez écrire:
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;
})();
ou:.
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;
})();
(Notez que je aussi changé c
-this.c
ou newTimer.c
si nécessaire, étant donné que votre version fait référence à plusieurs reprises à window.c
Notez également que dans le deuxième version, si vous n'avez pas besoin de code externe pour pouvoir accéder à c
, vous pouvez le changer en variable locale, rendant les choses plus propres.)
Parce que 'doWork' a été détaché de' this' lorsque vous passez à 'setTimeout'. Donc le second 'this.doWork' vous donne une autre valeur' this'. –
Quelle serait la bonne façon de le faire? Merci. – wayofthefuture
Remplacez simplement cette ligne par: 'startTimer: function() {c = 0; setTimeout (this.doWork.bind (this), 0); }, ' – jpsimons