Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

js: accessing scope of parent class

I have a jquery class within a normal class in javascript. Is it possible to access variables in the scope of the parent class from a callback function in the jquery class?

A simple example of what I mean is shown below

var simpleClass = function () {         this.status = "pending";     this.target = jqueryObject;     this.updateStatus = function() {         this.target.fadeOut("fast",function () {            this.status = "complete"; //this needs to update the parent class          });     }; }; 

Now in the above example, the callback function tries to access the scope of the jquery object. is there any way to access the status variable in the parent class?

like image 321
Sam Avatar asked Feb 24 '11 14:02

Sam


2 Answers

You set "this" to a variable in the parent function and then use it in the inner function.

var simpleClass = function () {              this.status = "pending";          this.target = jqueryObject;           var parent = this;      this.updateStatus = function() {                      this.jqueryObject.fadeOut("fast",function () {                             parent.status = "complete"; //this needs to update the parent class                       });              };      };  
like image 129
Tom Brothers Avatar answered Sep 17 '22 02:09

Tom Brothers


I will post this answer to this old question anyway as no one yet posted this before.

You can use the bind method on your function calls to define the scope which this belongs to.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

Normaly everytime you create a method - this belongs to the current scope of the function. Variables from scope2 can't see variables from scope1.

e.g.

function(){     // scope 1     this.baz = 'foo';      function(){         // scope 2         this.baz // not defined     }; }; 

with the bind method you can define the scope from this inside the function. So using .bind(this) you're telling the called function that their own scope from this is referred to the scope of the parent function, like:

function(){     // scope 1     this.baz = 'foo';      function(){         // scope 1         this.baz // foo     }.bind(this); }; 

so in your case, this would be an example using the bind method

var simpleClass = function () {         this.status = "pending";     this.target = jqueryObject;     this.updateStatus = function() {         this.target.fadeOut("fast",function () {            this.status = "complete"; //this needs to update the parent class          }.bind(this));     }.bind(this); }; 
like image 25
ins0 Avatar answered Sep 21 '22 02:09

ins0