Within my a certain function of a class, I need to use setInterval
to break up the execution of the code. However, within the setInterval
function, "this" no longer refers to the class "myObject." How can I access the variable "name" from within the setInterval
function?
function myObject() {
this.name = "the name";
}
myObject.prototype.getName = function() {
return this.name;
}
myObject.prototype.test = function() {
// this works
alert(this.name);
var intervalId = setInterval(function() {
// this does not work
alert(this.name);
clearInterval(intervalId);
},0);
}
myObject.prototype.test = function() {
// this works
alert(this.name);
var oThis = this;
var intervalId = setInterval(function() {
// this does not work
alert(oThis.name);
clearInterval(intervalId);
},0);
}
This should work. The anonymous function's "this" is not the same "this" as your myObject's "this."
Here's the prototype bind function
Function.prototype.bind = function( obj ) {
var _this = this;
return function() {
return _this.apply( obj, arguments );
}
}
This is what binding is for in Prototype:
function myObject() {
this.name = "the name";
}
myObject.prototype.getName = function() {
return this.name;
}
myObject.prototype.test = function() {
// this works
alert(this.name);
var intervalId = setInterval(function() {
// this does not work
alert(this.name);
clearInterval(intervalId);
}.bind(this),0);
}
Please note that s13james's answer is incomplete in that bind()
is not a standard feature and must be provided elsewhere - one way is using the prototype.js Javascript framework, while another will be to do it yourself using meouw's code example.
If you don't use bind()
(which is nifty, I must say) then djangel's response is what you could have done, and is what I most often do.