Jeena Paradies: Clousures - übergabe eines Objekts

Hallo,

Warum bekomme ich bei meinem Beispiel, trotz Clousures, undefined übergeben anstattdes Objektes?

  
 var selects = document.getElementsByTagName("select");  
 for (var i=0; i < selects.length; ++i) {  
  selects[i].onchange = function(){ alert(selects[i]); };  
 };  
  
 var inputs = document.getElementsByTagName("input");  
 for (var i=0; i < inputs.length; ++i) {  
  inputs[i].onclick = function(){ alert(inputs[i]) };  
 };

Grüße
Jeena Paradies

  1. Hi,

    Warum bekomme ich bei meinem Beispiel, trotz Clousures, undefined übergeben anstattdes Objektes?

    was passiert, wenn Du statt selects[i] bzw. inputs[i] einfach mal i ausgeben lässt?

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hallo,

      was passiert, wenn Du statt selects[i] bzw. inputs[i] einfach mal i ausgeben lässt?

      Mir ist klar, dass natürlich das i falsch ist, da es anscheinend nicht lokal in der clousure ist. Ich habe es jetzt auch hinbekommen, doch leider verstehe ich nicht wirklich warum das funktioniert, da ich irgendwie mit den Scopes wohl irgendwie durcheinander komme:

        
       function initialize ()  
       {  
        var selects = document.getElementsByTagName("select");  
        for (var i=0; i < selects.length; ++i) {  
         var j = i;  
         selects[i].onchange = function(){ alert(selects[j]); };  
        };  
        
        var inputs = document.getElementsByTagName("input");  
        for (var i=0; i < inputs.length; ++i) {  
         var j = i;  
         inputs[i].onclick = function(){ alert(inputs[j]) };  
        };  
       }
      

      Grüße
      Jeena Paradies

      1. Hallo,

        ich denke Cheatha wollte eher auf das hinaus:
        for (var i=0; i < selects.length -1; ++i)

        Grüße

        Michi

        1. Hi,

          ich denke Cheatha wollte eher auf das hinaus:
          for (var i=0; i < selects.length -1; ++i)

          äh, nö, ehrlich gesagt nicht :-)

          Cheatah

          --
          X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
          X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes
      2. Hi,

        Mir ist klar, dass natürlich das i falsch ist, da es anscheinend nicht lokal in der clousure ist.

        jo. Mein Tipp: Schau Dir die Function.bind()-Methode an, wie sie in prototype.js verwendet wird.

        Ich habe es jetzt auch hinbekommen, doch leider verstehe ich nicht wirklich warum das funktioniert, da ich irgendwie mit den Scopes wohl irgendwie durcheinander komme:

        Ich könnte jetzt niederschreiben, was Du Dir vermutlich auch schon zusammengereimt hast; aber ehrlich gesagt hoffe ich selbst, dass hier noch jemand vom Kaliber eines molily aufschlägt, der die Eingeweide von JavaScript kennt und präzise erklären kann, was da warum wie funktioniert. Dieses Thema habe ich bisher nämlich auch nur so weit angekratzt, wie ich es zur Anwendung benötigt habe.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
      3. function initialize ()
        {
          var selects = document.getElementsByTagName("select");
          for (var i=0; i < selects.length; ++i) {
           var j = i;
           selects[i].onchange = function(){ alert(selects[j]); };
          };

        var inputs = document.getElementsByTagName("input");
          for (var i=0; i < inputs.length; ++i) {
           var j = i;
           inputs[i].onclick = function(){ alert(inputs[j]) };
          };
        }

          
        Wobei mir nich klar ist, warum du nicht gleich this nimmst?  
          
        var inputs = document.getElementsByTagName("input");  
        for (var i=0; i < inputs.length; ++i) {  
        inputs[i].onclick = function(){ alert(this) };  
        };  
          
        Struppi.
        
        -- 
        [Javascript ist toll](http://javascript.jstruebig.de/) (Perl auch!)
        
        1. Hallo,

          Wobei mir nich klar ist, warum du nicht gleich this nimmst?

          var inputs = document.getElementsByTagName("input");
          for (var i=0; i < inputs.length; ++i) {
          inputs[i].onclick = function(){ alert(this) };
          };

          Es ist, weil mein Gehirn bisher noch nicht darauf kam, dass da überhaupt ein this in betracht kommen könnte. Jetzt aber wo ich das sehe wird mir klar, dass das funktionieren kann. Auch wenn sich meine Erklärungsversuche eher auf gefährliches Halbwissen stützen.

          Grüße
          Jeena Paradies

          1. Es ist, weil mein Gehirn bisher noch nicht darauf kam, dass da überhaupt ein this in betracht kommen könnte. Jetzt aber wo ich das sehe wird mir klar, dass das funktionieren kann. Auch wenn sich meine Erklärungsversuche eher auf gefährliches Halbwissen stützen.

            this ist immer der Kontext:

            inputs[i].onclick = function()
            {
            ...

            ist da onclick eine Funktion von inputs[i] ist, ist in der Funktion this gleich inputs[i]

            Struppi.

            --
            Javascript ist toll (Perl auch!)
            1. Hi,

              this ist immer der Kontext:

              und welches ist der Kontext - im IE?

              Wie gesagt, man schaue sich Function.bind() an.

              Cheatah

              --
              X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
              X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
              X-Will-Answer-Email: No
              X-Please-Search-Archive-First: Absolutely Yes
  2. so klappts:

    var selects = document.getElementsByTagName("select");
     for (var i=0; i < selects.length; i++) {
      selects[i].onchange = function(){ alert(selects[i-1]); };
     };

    var inputs = document.getElementsByTagName("input");
     for (var k=0; k < inputs.length; k++) {
      inputs[k].onclick = function(){ alert(inputs[k-1]) };
     };

    Gruß
    David

    1. ... ABER

      bei meiner Lösung wird immer das letzte Element der entspr. Abfrage angezeigt, weil die zugehörige Variable (i bzw. k) ja den Wert des letzten Elements angenommen hat.
      Also die Methode mit der Schleife muss noch mal überarbeitet werden ;-)

  3. Hallo,

    siehe auch </archiv/2006/9/t136283/#m885076>.

    Mathias

    --
    »No nations, no borders.«
    SELFHTML Weblog