function y() {You may attempt to refer the x in the run() function. However, in JavaScript, the scope of the function becomes the window after running setInterval() (or setTimeout()).
this.x = 0;
this.start = function () {
this.interval = setInterval(this.run, 1000);
};
this.run = function () {
this.x++;
debug(this.x); // or some other things you want to do
};
this.stop = function () {
clearInterval(this.interval);
};
}
To solve the problem, the code be written like this:
function y() {Since using the self variable will create a cyclic reference, it should be cleaned up properly. Otherwise, the garbage collector of the script interpreter(s) which use(s) reference count will not be able to collect the instance.
this.x = 0;
var self;
this.start = function () {
self = this;
this.interval = setInterval(run, 1000);
};
function run() {
self.x++;
debug(self.x);
}
this.stop = function () {
clearInterval(this.interval);
self = undefined;
};
}
Update (2009-03-29)
Thanks to the comment by dedogs, we could actually write the code like this without the cyclic reference:
function y() {
this.x = 0;
this.start = function () {
var self = this;
this.interval = setInterval(function(){ self.run(); }, 1000);
};
this.run = function () {
this.x++;
debug(this.x); // or some other things you want to do
};
this.stop = function () {
clearInterval(this.interval);
};
}