I have a JavaScript object with a privileged method. When this method has completed, I would like it to call itself (after a small timeout) and continue running indefinitely
Because this
outside the function is not the same as this
inside the function. Try instead:
function Test() {
// ... private variables that testMethod needs to access ...
var me = this;
this.testMethod = function() {
alert("Hello, from the method.");
setTimeout(me.testMethod, 2000);
};
}
When you first call it with "myTest.testMethod();" the "this" keyword is bond to your "myTest" object, when the timeout fires the "window" object is bond to "this" keyword and "this.testMethod" is equivalent to "window.testMethod". Try:
function Test() {
// ... private variables that testMethod needs to access ...
this.testMethod = function() {
alert("Hello, from the method.");
setTimeout((function(self){
return function(){self.testMethod();};
})(this), 2000);
};
}
var myTest = new Test();
myTest.testMethod();
Or:
function Test() {
// ... private variables that testMethod needs to access ...
this.testMethod = function() {
alert("Hello, from the method.");
var self = this;
setTimeout(function(){self.testMethod();}, 2000);
};
}
var myTest = new Test();
myTest.testMethod();
Try
function Test() {
// ... private variables that testMethod needs to access ...
this.testMethod = function() {
alert("Hello, from the method.");
var self = this;
setTimeout(function() { self.testMethod(); }, 2000);
};
}
or use setInterval.
because the this
in your setTimeout is referring to the local function testMethod
not Test
-- essentially, you are saying setTimeout( testMethod.testMethod, 2000 )
function Test() {
// ... private variables that testMethod needs to access ...
var self = this;
self.testMethod = function() {
alert("Hello, from the method.");
setTimeout(self.testMethod, 2000);
};
}
var myTest = new Test();
myTest.testMethod();