JavaScript-Funktion innerhalb der Schleife
Kann mir jemand erklären, warum JSLint beschwert sich über die "Funktion innerhalb der Schleife" mit diesem Beispiel:
for (var i = 0; i < buttons.length; i++) {
(function(i) {
buttons[i].onclick = function(e) {
t.progressBars[t.current].update(buttons[i].getAttribute("data-value"));
}
})(i);
}
Aber nicht ganz, wenn ich es zu ändern:
function makeHandler(i)
{
return function() {
t.progressBars[t.current].update(buttons[i].getAttribute("data-value"));
}
}
for (var i = 0; i < buttons.length; i++) {
buttons[i].onclick = makeHandler(i);
}
Ich verstehe nicht ganz, wie es scheint, dass mit jeder loop-iteration neue Funktion-Objekt zurückgegeben werden, auch wenn es passiert, innerhalb von makeHandler()
Funktion. Warum das zweite Beispiel ist ok, mit JS linters?
- 2. Beispiel bindet ich mit dem callback. 1. man muss nicht. haben Sie alle Werte i gleich n im ersten Beispiel. wenn das zweite eine 0 bis n-1.
- Wieder schauen. Der erste ist ein IFFE und macht das gleiche verbindliche.
- Es ist nur ein unter-informiert Warnung von jsLint. Menschen geben Ihre Warnungen mehr credit als er verdient. Es kann Sie warnen, über Dinge, die Sie nicht tun sollten, aber alles, was es ber ist kein problem und auch nicht zwingend etwas geändert werden sollten.
- Oh Gott. bin ich etwas fehlt? siehe diese Geige. nicht binden.
- du bist die Alarmierung der Anzahl
1
, nichti
. Dass nicht alles zeigen. - Äh, bist du aufrufen
alert(1)
; versuchen Sie anrufenalert(i)
- Sie haben einen Tippfehler in der fiddle alert(1) sollten wachsam sein, (ich) glaube ich
- oh. ja. tut mir Leid. danke für die Hilfe 🙂
- mein Fehler. 🙂 danke für die Hilfe.
- Dank Bruder. hab es jetzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Deine beiden Beispiele sind nicht gleichwertig.
In der ersten, erstellen Sie eine anonyme Funktion und ruft es auf jeder Schleife.
Die innere Funktion (das click-Ereignis-handler) ist in Ordnung - du bist die Zuweisung einer neuen Funktion, aber es ist die anonyme äußere Funktion, die ineffizient ist in diesem Kontext. In Ihrem zweiten Beispiel ist die äußere Funktion ist umgestaltet aus der Schleife, wo ist es nur einmal angelegt, statt
buttons.length
Zeiten.Zitat aus linterrors,
Würde ich gerne nutzen
Array.prototype.forEach
hier, wie diese