Clousures - übergabe eines Objekts
Jeena Paradies
- javascript
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
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
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
Hallo,
ich denke Cheatha wollte eher auf das hinaus:
for (var i=0; i < selects.length -1; ++i)
Grüße
Michi
Hi,
ich denke Cheatha wollte eher auf das hinaus:
for (var i=0; i < selects.length -1; ++i)
äh, nö, ehrlich gesagt nicht :-)
Cheatah
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
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!)
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
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.
Hi,
this ist immer der Kontext:
und welches ist der Kontext - im IE?
Wie gesagt, man schaue sich Function.bind() an.
Cheatah
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
... 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 ;-)
Hallo,
siehe auch </archiv/2006/9/t136283/#m885076>.
Mathias