var myObj = {
    name:"mike",
    go:function(){
        console.log(this.name);
    }
}
myObj.go()   //logs out mike
setTimeout(this.myObj.go,200)  //logs out (emptyString)
            Asked
            
        
        
            Active
            
        
            Viewed 106 times
        
    -1
            
            
         
    
    
        Brian Tompsett - 汤莱恩
        
- 5,753
- 72
- 57
- 129
- 
                    @adeneo The `this` pointer would not be set that way (well, it'd reference the global object in non-strict mode). – Fabrício Matté Apr 08 '13 at 21:18
- 
                    possible duplicate of [Pass correct "this" context to setTimeout callback?](http://stackoverflow.com/questions/2130241/pass-correct-this-context-to-settimeout-callback) – Fabrício Matté Apr 08 '13 at 21:24
- 
                    @adeneo Totally wrong. – Tomáš Zato Apr 08 '13 at 22:10
- 
                    2`this` isn't context. It's a special variable that is set by the call and can be any object (es3) or any value (es5 strict mode). – RobG Apr 08 '13 at 23:37
6 Answers
1
            
            
        Define a variable reffering to the object before:
var _this = this;
setTimeout(function() {_this.myObj.go();}, 200);
 
    
    
        Tomáš Zato
        
- 50,171
- 52
- 268
- 778
- 
                    1This is the most complete solution code, though OP seems to be using `this` to reference the global context, otherwise a variable declared through `var` would hardly be assigned to a property of an object. – Fabrício Matté Apr 08 '13 at 21:23
- 
                    1@FabrícioMatté Yeah the weird part is why they're referencing it with `this`, when they declare it with `var`. I think this method would be necessary if `this` was something specific to the context and was needed. – Ian Apr 08 '13 at 21:26
- 
                    @Ian Exactly. `=]` Finished reading answers, time to spend some upvotes then. – Fabrício Matté Apr 08 '13 at 21:27
1
            
            
        Several ways:
setTimeout(this.myObj.go.bind(this.myObj), 200);
or
var that = this;
setTimeout(function () {
    that.myObj.go();
}, 200);
Note that .bind isn't supported in older browsers, so a polyfill may be required in order to support it. Here's some information about the method: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind
 
    
    
        Ian
        
- 50,146
- 13
- 101
- 111
- 
                    Note that `.bind` has been introduced in ES5, therefore to support older browsers one should either use your version with a function wrapper or a [`.bind` shim](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind#Compatibility). – Fabrício Matté Apr 08 '13 at 21:28
- 
                    @FabrícioMatté Yeah, thanks for pointing it out - I didn't feel compelled enough to include that :) I'm wondering when it's going to be time that we stop pointing out when old browsers don't support certain methods. Probably never, as people will use old IE forever... – Ian Apr 08 '13 at 21:32
- 
                    Well, guess I'm one of the few which still spends sleepless nights patching my HTML5 page to be fallbackable to IE6 (yeah really) but well, I believe there isn't much use in supporting IE<8 so I'm slowly migrating and removing old IE hacks. None from us want to restrict ourselves from using advanced HTML5/CSS3 features just because of old IE, so my methodology now is just to apply graceful degradation down to IE8 tops. And yeah, IE8 doesn't support `.bind()` and it'd generate an ugly JS error breaking script execution. `:P` – Fabrício Matté Apr 08 '13 at 21:37
1
            
            
        var myObj = {
    name:"mike",
    go:function(){
        console.log(this.name);
    }
}
setTimeout(function(){myObj.go()},200)
 
    
    
        simple-thomas
        
- 671
- 7
- 20
1
            
            
        Try this
var myObj = {
    name:"mike",
    go:function(){
        console.log(this.name);
    }
}
myObj.go();   //logs out mike
setTimeout(function(){
    myObj.go(); //logs out mike too
},200);
 
    
    
        Fabrício Matté
        
- 69,329
- 26
- 129
- 166
 
    
    
        raj-nt
        
- 149
- 2
0
            
            
        Your code is right minus a few things.
setTimeout(this.myObj.go,200)
Should be
setTimeout(function() {myObj.go()},200)
It was undefined because this.myObj was not in the scope of setTimeout, nor was it wrapped in an anonymous function, or a variable function. You were on the right track though!
 
    
    
        Seth
        
- 10,198
- 10
- 45
- 68
 
    