/ Forside / Teknologi / Udvikling / Java Scripts / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java Scripts
#NavnPoint
molokyle 5410
Klaudi 2799
smorch 2439
kim 1360
Harlekin 1134
bentjuul 984
gibson 800
severino 695
Random 675
10  konsulent.. 626
Hjælp med closure
Fra : Kristian Thy


Dato : 25-04-07 22:37

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?

Pft
\\kristian


 
 
Lasse Reichstein Nie~ (28-04-2007)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 28-04-07 16:17

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.'

Kristian Thy (28-04-2007)
Kommentar
Fra : Kristian Thy


Dato : 28-04-07 20:24

On Apr 28, 5:17 pm, Lasse Reichstein Nielsen <l...@hotpop.com> wrote:
[snip]
> Held og lykke.

Lasse Reichstein to the rescue - igen :)

Takker.

\\kristian


Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409079
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste