Having The Correct Value Of 'this' In Js
Solution 1:
A technique commonly used in frameworks is to let the caller decide on what the this context should be for the callback function. So the FetchData function looks like (thanks to @Andy for telling me about the default scope when context is null or undefined - it is the global object),
this.FetchData = function(callback, context) {
callback.call(context, data);
};
When calling FetchData, pass Object1 as the context for the callback,
Object2.FetchData(this.OnData, this);
Another option is to bind the OnData function with Object1 using Function.prototype.bind
Object2.FetchData(this.onData.bind(this));
Solution 2:
The simple way of doing it is storing a reference to this in a variable, then using the call() method:
this.LoadData = function() {
varself = this;
Object2.FetchData(function () { self.OnData.call(self) });
};
If you're doing this a lot, you might want to consider using the .bind() method on the function prototype in ECMAScript 5th edition. This method can be implemented where unsupported:
// From Prototype.jsif (!Function.prototype.bind) { // check if native implementation availableFunction.prototype.bind = function(){
var fn = this, args = Array.prototype.slice.call(arguments),
object = args.shift();
returnfunction(){
return fn.apply(object,
args.concat(Array.prototype.slice.call(arguments)));
};
};
}
And the resulting function call:
this.LoadData = function() {
Object2.FetchData(this.OnData.bind(this));
};
Solution 3:
The basic solution is to force context on the callback with apply. (Or call. The difference is how parameters are passed. Either an array or 'normally') See the MDC for documentation.
Solution 4:
For a callback, you're stuck with 'this' being the window (usually). However, you could add a member to Object1 that points to itself (a lot of times it's gets call 'self', i.e. "var self = this;"), and then use that, i.e. self.DisplayStuff().
Solution 5:
The ambiguity of "this" is really annoying to me with javascript. So I just avoid "this" as much as possible. I do it this way:
var Object2 = (function() { // no need for a "new" keyword any morevarself = {}; // instead of the auto-supplied "this", create my own "self"self.FetchData = function(callback) {
// do some stuff
callback(data);
};
returnself; // don't forget to return "self"
});
var Object1 = (function() {
varself = {}; // instead of the auto-supplied "this", create my own "self"self.DisplayStuff = function() {
};
self.LoadData = function() {
Object2.FetchData(this.OnData);
};
self.OnData = function(data) {
self.DisplayStuff();
};
returnself; // don't forget to return "self"
});
You lose the ability to use Object.prototype with this technique, you lose the ability to test using "instanceof", but you never have to think about what "this" is.
Post a Comment for "Having The Correct Value Of 'this' In Js"