Kristian Thy <thy@42.dk> writes:
> Jeg har lidt problemer med scope for this - et kort skeleteksempel:
>
> function obj()
> {
> this.prop = 'foo';
> }
>
> obj.prototype.f = function()
> {
> alert(this.prop);
> }
>
> function g(fx)
> {
> fx();
> }
>
> var _o = new obj();
> _o.f();
> g(_o.f);
>
> Første kald til f() viser foo. Andet kald viser undefined, fordi this
> nu referer til Window. Kan man bevare konteksten så this peger på
> objektet _o når _o's funktion bliver givet til en anden - og i givet
> fald hvordan?
Det er kald-måden der bestemmer hvad "this" er bundet til. Det er
derfor "o.f()" binder "this" til "o" mens "f" udføres, mens "fx()"
binder "this" til det globale objekt.
For at sørge for at alle kald til den metode der findes som "o.f"
vil binde "this" til "o", så skal man wrappe metoden i et kald der
gør netop det.
Tilføj fx følgende til "obj"-funktionen:
var self = this;
var func = this.f;
this.f = function(x) {
return func.call(self,x);
}
Eller i stedet kan du vælge at binde f til o når du tager den ud:
function bind(o,funcName) {
return function(x) {
return o[funcName](x);
}
}
og så kalde
g(bind(o,"f"));
Held og lykke.
/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
DHTML Death Colors: <URL:
http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'