JS-Beginner: for-Variable in Funktion

Hallo JSler,

ich habe ein Problem mit einem Stück JS-Code, den ich geschrieben habe, der aber iwie nicht so ganz funktionieren will...

  
//...  
for (var i = 0; i < this.options.length; ++i) {  
    if (this.options[i].indexOf(this.inputElement.value) != -1) {  
        var link = document.createElement("a");  
        link.href = "javascript:void(0);";  
  
        var pThis = this;  
        link.onclick = function()  
        {  
            alert(i);  
            pThis.inputElement.value = pThis.options[i]; // Hier ist i immer 2...  
            pThis.hide();  
        }  
  
        link.appendChild(document.createTextNode(this.options[i]));  
        this.element.appendChild(link);  
    }  
}  
//...  

Ich hab auch schon versucht die Variable aus der for-Schleife (i) zum Objekt hinzuzufügen, aber erstens finde ich diese Lösung nicht gerade elegant und zweitens hat die genau dasselbe bewirkt wie diese (?)...

Der obige Code funktioniert einwandfrei, bis auf die markierte Zeile...
Ich würde mich freuen, wenn mir jemand sagen könnte, wie ich dieses Problem lösen kann, weil ich mir daran schon etwas länger die Zähne ausbeiße.

Grüße JS-Beginner

  1. //...
    for (var i = 0; i < this.options.length; ++i) {
        if (this.options[i].indexOf(this.inputElement.value) != -1) {

    ...

    var pThis = this;

    Du musst die Variablen in die Funktion verlegen.
    Denn pThis unterliegt dem function scope und  wird in dieser Schleife
    nicht neu definiert, sondern immer neu zugewiesen.

    link.onclick = function()
            {

    ---> so       var pThis = this;

    alert(i);
                pThis.inputElement.value = pThis.options[i]; // Hier ist i immer 2...
                pThis.hide();
            }

    ...

    }
    }

      
    mfg Beat
    
    -- 
    
    ><o(((°>           ><o(((°>  
    
       <°)))o><                     ><o(((°>o  
    Der Valigator leibt diese Fische
    
    1. Du musst die Variablen in die Funktion verlegen.
      Denn pThis unterliegt dem function scope und  wird in dieser Schleife
      nicht neu definiert, sondern immer neu zugewiesen.

      Das ist für diesen Fall belanglos, es ging um das i.

      Struppi.

  2. Hallo JS,

    zum Zeitpunkt des Klicks hat i den Wert des letzten Schleifendurchlaufs. Du muss das i zwischenspeichern, z.B. als neue Eigenschaft des Elements link:

    ...

    link.nr = i;  
    link.onclick = function() {  
      alert(this.nr);  
    }
    

    ...

    Gruß, Jürgen

    1. Hallo JS,

      zum Zeitpunkt des Klicks hat i den Wert des letzten Schleifendurchlaufs. Du muss das i zwischenspeichern, z.B. als neue Eigenschaft des Elements link:

      ...

      link.nr = i;

      link.onclick = function() {
        alert(this.nr);
      }

      
      > ...  
      >   
      > Gruß, Jürgen  
      >   
        
      Vielen Dank, du hast das Problem gelöst :)  
        
      Nur noch so ne Verständnisfrage: Müsste i nicht eigentlich längst gelöscht sein, wenn der Klick ausgeführt wird? Immerhin wurde doch die Schleife verlassen, und i (da es eine lokale Variable ist) dürfte doch dann garnicht mehr existieren, oder?
      
      1. Nur noch so ne Verständnisfrage: Müsste i nicht eigentlich längst gelöscht sein, wenn der Klick ausgeführt wird? Immerhin wurde doch die Schleife verlassen, und i (da es eine lokale Variable ist) dürfte doch dann garnicht mehr existieren, oder?

        Jein.

        Die Eventfunktion ist ja im lokalen Gültigkeitsbereich der äußeren Funktion, aufgrund dessen bleiben alle lokalen Variabeln dort (also in der Eventfunktion) erhalten.

        Struppi.

        1. Nur noch so ne Verständnisfrage: Müsste i nicht eigentlich längst gelöscht sein, wenn der Klick ausgeführt wird? Immerhin wurde doch die Schleife verlassen, und i (da es eine lokale Variable ist) dürfte doch dann garnicht mehr existieren, oder?

          Jein.

          Die Eventfunktion ist ja im lokalen Gültigkeitsbereich der äußeren Funktion, aufgrund dessen bleiben alle lokalen Variabeln dort (also in der Eventfunktion) erhalten.

          Struppi.

          Aso, JS kann schon manchmal recht gemein sein, wenn man Sprachen wie C gewöhnt ist :|

          Also nochmal vielen Dank für eure Hilfe

      2. Hallo JS,

        Nur noch so ne Verständnisfrage: Müsste i nicht eigentlich längst gelöscht sein, wenn der Klick ausgeführt wird? Immerhin wurde doch die Schleife verlassen, und i (da es eine lokale Variable ist) dürfte doch dann garnicht mehr existieren, oder?

        das "i" wurde in den Eventhandlern "konserviert" und daher nach Ende der Schleife nicht gelöscht.

        Gruß, Jürgen