Reference Instance Variables in Javascript Constructor

anonymous-function, closures, javascript, oop

Solution

Unless you specify a this context when calling a function the default will be the global (which in browsers is window).

Alternatives are:-

obj = function() { 
  this.foo = undefined; 
  this.changeState = function () { 
    (function () { this.foo = "bar" }).call(this); // This is contrived, but same idea.
  }; 

};

or:-

obj = function() {
  var self = this;
  this.foo = undefined; 
  this.changeState = function () { 
    (function () { self.foo = "bar" })(); // This is contrived, but same idea.
  }; 

};

Problem

I'm trying to maintain state on an object by doing something like this: ``` obj = function() { this.foo = undefined; this.changeState = function () { (function () { this.foo = "bar" })(); // This is contrived, but same idea. }; }; ``` I want to set the instance variable foo to "bar" when I call the changeState method. For instance: ``` o = new obj(); o.changeState(); alert(o.foo); // This should say "bar" ``` As far as I can tell, what is happening is that "this" in the inner anonymous function is pointing to window. I'm not sure what's going on. Am I on the right track? Is there a better approach?

Original source