Heute habe ich eine Javascript-Frage gesehen, die Ereignisse gemäß dem gesunden Menschenverstand in einer Schleife verknüpfte, aber das Ergebnis war nicht das, was ich wollte.
link var as = document.getElementsByTagName('a ');
for ( var i = as.length; i--; ) {
as[i].onclick = function() {
return false; 🎜>}
}
Um es einfach auszudrücken: Es handelt sich um ein Funktionsvariablenbereichsproblem. Wenn function() { warning(i); die Variable i nicht intern definiert ist a(), aber es wird intern verwendet, also habe ich das in der for-Schleife definierte i gefunden. Die Ausführung des Click-Ereignisses begann, nachdem die for-Schleife abgeschlossen war. 1; also ist es jedes Mal -1;
2. Die for-Schleife mit 2 Parametern ist auch nicht üblich! Verwechseln?
for (Anweisung 1, Anweisung 2, Anweisung 3) {
//todo
}
a.for-Schleifenbedingung
Im Allgemeinen sind Aussage 1, Aussage 2 und Aussage 3 alle optional.
b. Aussage 2:
Normalerweise wird Aussage 2 verwendet, um die Bedingungen der Anfangsvariablen auszuwerten.
Aussage 2 ist ebenfalls optional.
Wenn Anweisung 2 „true“ zurückgibt, beginnt die Schleife erneut, wenn sie „false“ zurückgibt, wird die Schleife beendet.
Tipp: Wenn Sie Anweisung 2 weglassen, müssen Sie eine Pause innerhalb der Schleife einbauen. Andernfalls kann der Zyklus nicht gestoppt werden. Dies kann zum Absturz des Browsers führen.
c. Bezüglich i--Urteil:
Bei der Beurteilung von i--wahr/falsch wird zuerst i-- beurteilt und dann i-- berechnet. Bei der Eingabe des letzten Urteils von i--, als i==0 tatsächlich beurteilt wurde, wurde i-- nach dem Urteil erneut ausgeführt und die for-Schleife beendet, sodass der Wert von i zu -1 wurde; var i = 1;
!!i--;//ture
Lösung:
Code kopieren
Der Code lautet wie folgt:
return false;
}
})(i)
}
Oder:
Code kopieren
Der Code lautet wie folgt:
return false; 🎜>Andere Internetnutzer haben es in der 7-Methoden-Demo gelöst:
Code kopieren
Der Code lautet wie folgt:
< ;head> title>Closure Demonstration
Produkt Zwei< /p>
Produkt drei
🎜>< /body> 1. Speichern Sie die Variable i für jedes Absatzobjekt (p)
Code kopieren
Der Code lautet wie folgt:
function init() {
var pAry = document.getElementsByTagName("p"); >for( var i=0; i
pAry[i].i = i;
pAry[i].onclick = function() {
alert(this. i);
}
}
2. Speichern Sie die Variable i in der anonymen Funktion selbst
Kopieren Code
Der Code lautet wie folgt:
function init2() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i
(pAry [i].onclick = function() {
alert(arguments.callee.i);
}).i = i;
}
}
3 , fügen Sie eine Abschlussschicht hinzu und i wird in Form von Funktionsparametern an die innere Funktion übergeben
function init3() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i
(function( arg){
pAry[i].onclick = function() {
alert(arg);
};
})(i);//Parameter wann Aufruf
}
}
4. Fügen Sie eine Abschlussschicht hinzu und übergeben Sie i in Form einer lokalen Variablen
function init4() {
var pAry = document.getElementsByTagName("p");
for( var i=0; i
(function () {
var temp = i; //Lokale Variable beim Aufruf
pAry[i].onclick = function() {
alert(temp);
})();
}
}
5 Gibt eine Funktion als Antwortereignis zurück (beachten Sie den subtilen Unterschied zu 3)
function init5() {
var pAry = document .getElementsByTagName("p");
for( var i=0; i
pAry[ i].onclick = function(arg) {
return function() { //Eine Funktion zurückgeben
alert(arg);
}(i); }
6. Verwenden Sie die Funktion zum Implementieren. Tatsächlich wird jedes Mal, wenn eine Funktionsinstanz generiert wird, ein Abschluss generiert
Code kopieren for( var i= 0; ipAry[i].onclick = new Function ("alert(" i ");");//new generiert jeweils eine Funktionsinstanz
}
}
7. Verwenden Sie die Funktion zur Implementierung, achten Sie auf den Unterschied zu 6
Code kopieren
pAry[i].onclick = Function('alert(' i ')')
}
}
Die Zusammenfassung ist vollständig, willkommen Mitmachen!