How to use "setTimeout" to invoke object itself
javascript, settimeout
Solution
Try replacing this line:
setTimeout('this.feedbackTag.removeChild(info)', 5000);
with these two lines:
var _this = this;
setTimeout(function() { _this.feedbackTag.removeChild(info); }, 5000);
Note:
Never pass `setTimeout` a string, as this invokes `eval` (which you should only use when necessary). Instead, pass `setTimeout` a function reference (this can be an anonymous function).
Finally, always check that the `this` keyword is pointing to what you think it points to (see http://www.alistapart.com/articles/getoutbindingsituations).
Addressing Question 2:
I believe that for normal functions, `this` is set to the `window` object—regardless of where they are declared. So moving the code into a separate function wouldn't fix the problem.
Problem
Why can't I use `setTimeout` in a javascript object? ``` Message = function () { ... ... this.messageFactory = ... this.feedbackTag = document.getElementById('feedbackMessages'); this.addInfo = function (message) { var info = this.messageFactory.createInfo(message); // create a div this.feedbackTag.appendChild(info); setTimeout('this.feedbackTag.removeChild(info)', 5000); // why in here, it complain this.feedbacktag is undefined ?????? }; } ``` Thanks for Steve`s Solution, now it will work if the code is as below... because the 'this' before was actually pointing to the function within setTimeOut, it cannot rearch Message. ``` Message = function () { ... ... this.messageFactory = ... this.feedbackTag = document.getElementById('feedbackMessages'); this.addInfo = function (message) { var info = this.messageFactory.createInfo(message); // create a div this.feedbackTag.appendChild(info); var _this = this; setTimeout(function() { _this.feedbackTag.removeChild(info); }, 5000); }; } ``` But why doesn`t it work if we do this: ``` Message = function () { ... ... this.messageFactory = ... this.feedbackTag = document.getElementById('feedbackMessages'); // public function this.addInfo = function (message) { var info = this.messageFactory.createInfo(message); // create a div this.feedbackTag.appendChild(info); delayRemove(info); }; // private function function delayRemove(obj) { var _this = this; setTimeout(function() { _this.feedbackTag.removeChild(info); }, 5000); } } ```