2012-03-23 4 views
0

ich diesen Code haben:Ein Schließungsproblem haben. Kann nicht scheinen, es zu lösen. Bitte geben Sie

_trackit: function(){ 
    for(var key in this.items.sublinks){ 
    switch(key){ 
     case 'shoes': 
      for(var innerkey in this.items.sublinks[key]){ 
       (function(){ 
        $(innerkey).observe('click', (function(e){ 
        Event.stop(e); 
        someClass.click_link(this.items.sublinks[key][innerkey],false) 
        })); 
       )(this); 
      } 
     break; 
    } 
    } 
} 

Der Hash ich vorbei bin in hat eine Größe von 2. Aber wie Sie beide der Verbindungen (da die Hash-Karten Links) erraten würden, sind vorbei die letzte Hash-Wert zu kommen (someClass.click_link < - hier ist dieser Wert, this.item.sublinks[key][innerkey]).

Ich habe versucht, eine Innerfuction etc ..., aber etwas ist in Unordnung. Wenn ich zu "innere Funktion tief" gehe, dann gibt undefined zurück.

Irgendwelche Hilfe?

Antwort

1

Wie andere erwähnten, müssen Sie ein Argument haben, um das "das" zu erhalten, das Sie übergeben. Sie müssen auch Kopien der Variablen "key" und "innerkey" übergeben, um die Schließungen innerhalb von for loops bug zu vermeiden.

var make_event_listener = function(that, key, innerKey){ 
    return function(e){ 
     Event.stop(e); 
     someClass.click_link(that.items.sublinks[key][innerkey], false) 
    }; 
}; 

//... 
for(var innerkey in this.items.sublinks[key]){ 
    $(innerkey).observe('click', make_event_listener(this, key, innerKey)); 
} 
//... 

Natürlich können Sie eine anonyme Version von make_event_listener stattdessen aber ich auf diese Weise besser lesbar finden.

+0

vielen dank, schätze es. –

2

Da Sie this in als Argument vorbei sind, müssen Sie nur einen Parameter erstellen für sie es nennen —, sagen wir, _this — und dann können Sie auf _this statt this innerhalb der Funktion verweisen:

   (function(_this, innerkey){ 
        $(innerkey).observe('click', (function(e){ 
        Event.stop(e); 
        someClass.click_link(_this.items.sublinks[key][innerkey],false) 
        })); 
       )(this, innerkey); 

(es gibt andere Möglichkeiten als gut, aber das scheint über die Art und Weise zu sein, sie gingen, wenn Sie this übergeben als Argument? Und es ist eine durchaus beachtliche Möglichkeit, es zu tun.)

Edited hinzufügen: Per Rob W Kommentar habe ich die oben bearbeitet und innerkey als Parameter hinzuzufügen, da sonst die innere function(e){...} Ausdruck derselben innerkeyVariable wie die äußere Funktion — eine Variable, die beziehen, als eine Schleifenvariable hat sich wahrscheinlich zu dem Zeitpunkt geändert, zu dem die innere Funktion tatsächlich ausgeführt wird. Übergeben Sie es als Parameter gibt den inneren Ausdruck eine neue innerkey Variable, die gleich ist, was innerkeywar, wenn die innere Funktion erstellt wurde.

+1

Vergessen Sie nicht die Variable 'innerKey'. –

+0

@RobW: Richtig, es kann geändert haben, worauf es sich bezieht, wenn die Schließung tatsächlich ausgeführt wird. Guter Punkt, ich werde das reparieren; Vielen Dank! – ruakh

+0

thnk du sehr viel –

1

Der zweite Aufruf von "this" verweist auf das tatsächlich angeklickte Element. Ändern Sie es zu:

Verwandte Themen