Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Referencing "this" from within a javascript callback

Something has always bothered me about the way I do object-oriented coding in Javascript. When there's a callback, I frequently want to reference the object which originally called the function, which leads me to do something like this:

MyClass.prototype.doSomething = function(obj, callback) {
    var me = this; // ugh
    obj.loadSomething(function(err, result) {
        me.data = result; // ugh
        callback(null, me);
    });
}

First off, creating the additional variable alway seemed... excessive to me. Furthermore, I have to wonder if it might end up causing problems (circular references? un-GCd objects?) by passing the "me" variable back to the callback.

Is there a better way to go about this? Is this approach evil?

like image 964
Zane Claes Avatar asked Oct 31 '12 19:10

Zane Claes


2 Answers

This is what Function.bind() is for:

MyClass.prototype.doSomething = function(obj, callback) {
    obj.loadSomething((function(err, result) {
        this.data = result;
        callback(null, this);
    }).bind(this));
}
like image 193
millimoose Avatar answered Sep 23 '22 09:09

millimoose


AFAIK, what you are doing is the accepted pattern for this kind of thing, and doesn't cause any issues. A lot of people use either "self" or "that" as the stored reference - "self" can be more intuitive if you come from a python background.

like image 38
shelman Avatar answered Sep 22 '22 09:09

shelman