NEWS
Javascript Warnung
-
Ich hätte da mal eine Frage an die JS-Profis.
Ich habe mir da mit tabulator.js eine Tabelle gemacht, wo ich das Format des Gruppenheader dynamisch ändere in Abhängigkeit des Gruppeninhalts.
Das mache ich über die renderComplete-Callback().
Funktioniert eigentlich tadellos.
Ich dabe die Entwicklung in der Online-Sandbox https://jsfiddle.net/21ho4pez/3/ gemacht.
Dabei ist mir eine Warnung aufgefallen, die zwar nicht stört, aber ich weis auch nicht wie ich das besser machen kann.Die Warnung kommt, weil ich innerhalb einer array.some() eine Variable verwende, die außerhalb des scope definiert ist. Hier das array groups[i].
Wie löst man denn das denn prinzipiell sauber, wenn man innerhalb einer .some(), .map() etc. auf Variablen zugreifen muss, die nicht in diesem scope definiert wurden?
P.S. wenn ich das array-element vorab in eine variable packe gibt es die Warnung nicht.
const group = groups[i]; const statusOpen = data.some(g => g.ort === group && g.status === 'open');
Weis der Himmel warum das nötig ist.
Gruß
Reiner -
@rewenode Der springende Punkt ist, dass du das in einer Schleife tust, die aber dummerweise durch die Meldung in deinem Screenshot verdeckt ist.
-
@alcalzone sagte in Javascript Warnung:
die aber dummerweise durch die Meldung in deinem Screenshot verdeckt ist
Na, du kannst dir doch den Originalcode mit einem Click auf den geposteten jsfiddle.net anschauen. Macht ja keinen Sinn, den hier nochmal zu posten;-)
Das mit der Schleife verstehe ich nicht, da der code ja ohne jegliche Probleme läuft.
Die Warnung (oder besser der Hinweis) sagt ja nur, dass es verwirrend sein könnte, wenn innerhalb der Funktion auf Variablen mit äußerem Gültigkeitsbereich zugegriffen wird.
In diesem Fall groups und i.
Aber das ist ja in JS ausdrücklich kein Problem.
Dass ich beim Umweg über eine externe Variable für groups[i] keinen Hinweis bekomme, ändert ja nichts daran, dass trotzdem auf die externe Variable zugegriffen wird.
Ganz kurios ist es, dass jsfiddle sich über Nacht überlegt hat, dass die Syntax wohl doch korrekt ist und somit keinen Hinweis mehr zeigt;-)
Ich schieb's mal auf eine Eigenwilligkeit der Online-IDE.Klar eigentlich keine Problemfrage. Bin halt mit JS immer noch am lernen, da hat mich das verunsichert.
Wollte mir da keine evtl. problematische Syntax angewöhnen. -
@rewenode Joar, die Warnung kannst du getrost ignorieren. Schätze die wurde noch nicht auf
let
aktualisiert.Das eigentliche Problem tritt bei Schleifen mit
var
auf (hier hati
einen anderen Scope), und Callback-Funktionen die nicht sofort ausgeführt werden (der von .some wird es aber!):for (let i = 1; i <= 5; i++) { setTimeout(() => console.log(i), 100); } // gibt aus: // 1 // 2 // 3 // 4 // 5
for (var i = 1; i <= 5; i++) { setTimeout(() => console.log(i), 100); } // gibt aus: // 6 // 6 // 6 // 6 // 6
Und genau auf letzteres ist diese Warnung abgezielt, weil das ist nämlich wirklich verwirrend. Ich dachte auch erst, da wird 5 ausgegeben...
-
@alcalzone Danke, dass du dir das mal angesehen hast!
Da bin ich etwas schlauer. Die let/var Problematik war mir zwar bewusst, bin aber nicht auf die Idee gekommen, dass die IDE darauf abzielen könnte.
Dass die IDE heute nicht mehr meckert, lag allerdings nur daran, dass ich die log-Ausgaben in der Schleife auskommentiert hatte.
Ist tatsächlich so, wenn ich groups[i] in eine Variable packe, wird nicht gemeckert.
Verwende ich groups[i] direkt, gibt es den Hinweis.Danke nochmal
Reiner -
@rewenode sagte in Javascript Warnung:
wenn ich groups[i] in eine Variable packe, wird nicht gemeckert.
Ja, weil du dann nicht mehr die loop-Variable zu einem Zeitpunkt referenzierst, der ggf. zu spät ist.
Wie gesagt, beilet
sch***egal