问题
I have a class I am attempting to use to manage a session on the client side, it looks like this:
var sessionmanager;
sessionmanager = (function() {
sessionmanager.name = 'sessionmanager';
function sessionmanager(timeout, action) {
if (action != null) {
this.action = action;
} else {
this.action = null;
}
if (timeout != null) {
this.timeout = timeout * 60;
} else {
this.timeout = 0;
}
}
sessionmanager.prototype.run = function() {
return window.setInterval(this.tick, 1000);
};
sessionmanager.prototype.sessionExpired = function() {
if (this.action != null) {
window.navigate("timeout.asp");
}
};
sessionmanager.prototype.setTimeout = function(timeout) {
return this.timeout = timeout;
};
sessionmanager.prototype.tick = function() {
this.timeout -= 1;
if (this.timeout < 1) {
return sessionExpired();
}
};
return sessionmanager;
})();
However when I debug inside the tick function that is called from within the setInterval callback I get this.timeout = NaN
I am guessing I scoped something incorrectly? Help please? I am new to javascript...
回答1:
If setInterval calls the function it doesn't set the this value as you may expect. Calling this.tick() does set it correctly, but just passing the function and having it called in another way does not. You have to bind the this value to what you want:
setInterval(this.tick.bind(this), 1000);
This is available on newer browsers but there are shims available.
Also, you probably meant this.sessionExpired(), as that's where it's defined. return doesn't make much sense there since setInterval does not care about the return value.
回答2:
Have you ever set the timeout? You might want
sessionmanager.timeout=0;
somwhere in the class definition.
回答3:
In ES7 Javascript you can do the following:
window.setInterval(::this.tick, 1000);
The double colon syntax :: is a shortcut to .bind(this).
来源:https://stackoverflow.com/questions/11333311/javascript-setinterval-scoping-issue