Your problem is with this line: $('#some-element').click(this.doSomething);
Why this is a problem
JavaScript methods don't know anything about the object that should be assigned to this
, it's set when the method is called either explicitly (with myFunction.call(obj)
) or implicitly (when called using obj.myFunction()
).
For example:
var x = {
logThis: function () {
console.log(this);
}
};
x.logThis(); // logs x
x.logThis.call(y); // logs y
var func = x.logThis;
func(); // logs window: the fallback for when no value is given for `this`
In your case, you're passing this.doSomething
to jQuery, which is then explicitly calling it with the element that was clicked as the value of this
. What's happening is (a slightly more complex version of) this:
var callback = this.doSomething;
callback.call(anElement, anEvent);
The solution
You need to make sure that doSomething
is called with the right value of this
. You can do that by wrapping it in another function:
var cb = this;
$('#some-element').click(function() {
return cb.doSomething();
});
jQuery provides a proxy
function lets you do this more simply:
$('#some-element').click(jQuery.proxy(this.doSomething, this));
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…