JSHint nicht lassen Sie mich 'forEach' in einer 'for' - Schleife
Ich habe ein Objekt mit arrays als Werte.
people = {
'steve':['foo','bar'],
'joe':['baz','boo']
}
Für jeden Schlüssel, ich würde gerne eine Schleife über die Werte in das entsprechende array. Einfach genug:
for ( var person in people ) {
person.forEach( function(item) {
console.log(item)
})
}
Aber JSHint meckert:
Don't make functions within a loop.
Ist dies wirklich ein Problem mit meinem code? Ich mag die kurzen ES5 for-Schleife syntax. Brauche ich für die Nutzung der ES3-Stil oder ändern mein code in irgendeiner anderen Art und Weise?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es zwei Probleme gibt, die eine, JSHint ist die Warnung, die Sie über, und ein grundlegenderes.
Die Sache, JSHint ist die Warnung, die Sie darüber ist, dass in der Theorie, jedes mal, dass die Schleife ausgeführt wird, wird eine neue Funktion erstellt. Besser wäre:
Ich sage "in der Theorie", denn obwohl die Spezifikation erfordert, dass eine neue Funktion Objekt werden jedes mal erstellt, wenn, das bedeutet nicht, dass die Motoren nicht die Wiederverwendung der zugrunde liegenden Umsetzung der Funktion, und es bedeutet nicht, dass die Motoren nicht die Wiederverwendung der gleichen function-Objekt, wenn Sie nicht zuweisen, alle anderen Eigenschaften, oder einen Verweis darauf beibehalten. Ich fragte die V8 Jungs darüber (V8 als JavaScript-engine in Chrome), und Sie sagte, dass Chrome "...in den meisten Fällen..." Wiederverwendung der zugrunde liegenden Implementierung der Funktion für unterschiedliche Funktion erstellte Objekte an der gleichen Stelle in den Quellcode, und dass Sie "erwarten", dass die meisten anderen Motoren würden das gleiche tun.
So JSHint vielleicht ein bisschen over-the-top-in diesem speziellen Fall. Aber es ist Häufig eine nützliche Warnung, insbesondere, wenn die Funktionen, die Sie erstellen, innerhalb der Schleife beziehen sich auf Variablen, deren Inhalt ändert sich während der Schleife, das ist der klassische Verschluss-Fehler, den Menschen machen.
Aber mehr grundlegend,
person
ist einString
(es ist der name einer Eigenschaft inpeople
), undString
nichtforEach
. Sie wollte:...z.B.
people[person]
das array für die Schlüssel.people[person].forEach(...)
. Trotzdem, die Warnung scheint zu sein, ziemlich blöd mit modernen JS-engines -, die Sie wahrscheinlich gewonnen ' T erstellen Sie eine neue Funktion, die für jede iteration.people
ist ein Objekt (mit den arrays).Neben anderen Kommentatoren, wenn Sie wissen, was Sie tun, Sie können diese Warnung deaktivieren mit JSHint option
loopfunc
:Können Sie festlegen, JSHint-Optionen Global (wenn Sie mit den NPM-Modul), pro Datei oder pro-Funktion.
Sie erlaubt sind zu verwenden
forEach
innerhalb der Schleife, aber Sie sind nicht erlaubt zu erklären, eine Funktion innerhalb einer Schleife.... sonst bist du Neuerstellung der gleichen Funktion für jede iteration.
Es ist nicht das forEach, es ist die anonyme Funktion, die es beschweren.
Der Grund, warum dies ein problem ist, dass es ein neues Objekt erstellen Referenz auf die anonyme Funktion in der
foreach
Aufruf in den Heap jedes mal, wenn Sie dies tun. Es wäre besser, wenn Sie die Aufgabe auf eine variable außerhalb der for-Schleife, so ist man nicht Essen, bis Speicher unnötig