views:

34

answers:

3

I'm having difficulty referencing "this" from within a javascript inline function, within an object method.

var testObject = {
    oThis : this,
    testVariable : "somestring",
    init : function(){

       console.log(this.testVariable); // outputs testVariable as expected

       this.testObject.submit(function(){

            var anotherThis = this;
            console.log(this.testVariable) // undefined
            console.log(oThis.testVariable) // undefined
            console.log(testObject.testVariable) // outputs testVariable 
            console.log(anotherThis.testVariable) // undefined

    }

}

How do I access this.testVariable from within the submit function? I'm also using jQuery as well, if that makes a difference.

I wonder if this is the best approach - and maybe I should have submit as a separate function, and then reference that inline, like:

 init : function(){

    this.testObject.submit = this.submitForm;

 },
 submitForm : function(){
     // do validation here
     console.log(this.testVariable) // outputs testvariable

     .
     .
     .

     return valid; 
 }

But this didn't seem to work either - and I think I'd just like to keep the submit function inline within my init method for now.

A: 

A common way is to assign the this you want to a local variable.

init : function(){
   var _this = this;
   this.testObject.submit(function() {
        console.log(_this.testVariable) // outputs testVariable 
   });
}
Matti Virkkunen
Oh the assignment of "this" is inside the init function - of course...goddamit!That's what I was trying to do, but assigning it within the anonymous function instead...thanks for your help!
Matt
A: 
Pointy
A: 

You can only access the oThis variable from the context of the object, which is lost because you are inside of another function. or through instantiating a new object. like this

var testInstance = new testObject();

Then you could access oThis by using:

testInstance.oThis;

but that would be redundant

I would try something like this Matt:

init: function(){

var self = this; // this allows you to access the parent object from different contexts

this.testObject.submit(function(){

    console.log(self.testVariable);

}
SethZanderJensen