Zum Zeitpunkt, zu dem die Funktion aufgerufen wird, ist die Schleife abgeschlossen. Es gibt nur eine i
Variable und die Funktion sieht immer ihren aktuellen Wert. Also, wenn Sie i
von innerhalb der Funktion verwenden, werden Sie es mit dem Wert lis.length
sehen.
Es gibt Möglichkeiten, um es herum. Wenn Sie ES2015 verwenden können (möglicherweise durch eine Transpiler), dann können Sie schreiben:
const lis = document.querySelectorAll('li');
for(let i = 0; i < lis.length; i++){
lis[i].addEventListener('mouseover',() => lis[i].style.color = 'green');
lis[i].addEventListener('mouseout',() => lis[i].style.color ="black");
};
und jetzt haben Sie eine andere i
für jedes Mal durch die Schleife.
Oder in älterem Code können Sie den Loop-Körper zu einer anderen Funktion ausdrücken und i
als Parameter übergeben. Das hat die gleiche Wirkung, eine andere Variable für jede Ereignisbindung:
var lis = document.querySelectorAll('li');
var _loop = function _loop(i) {
lis[i].addEventListener('mouseover', function() {
return lis[i].style.color = 'green';
});
lis[i].addEventListener('mouseout', function() {
return lis[i].style.color = "black";
});
};
for (var i = 0; i < lis.length; i++) {
_loop(i);
}
(das ist der Code automatisch durch babel vom ES2015 Beispiel hergestellt I oben gegeben haben)
Eigentlich zu bekommen, '' 'i''' noch definiert sein, aber auf dem letzten Wert der for-Schleife stecken (in diesem Fall lis.length, wodurch '' 'lis [i]' '' undefiniert). Dies ist auf Javascript-Schließungen zurückzuführen. Siehe @ Duncans Antwort. –
@MichaelYang danke für den Hinweis, ich war mehr auf die Lösung als die Wurzel des Problems – Erazihel
Natürlich - Ihre Lösung ist sehr gut! Ich wollte nur darauf hinweisen :-) –