NEWS
JS variablen lieber lokal als global
-
Hallo, ich habe in meinen Skripten die IDs, mit welchen ich auf die Objekte zugreife global deklariert.
So habe ich diese in jedem Skript auch sicher mit der gleichen Id zur Verfügung.Ausversehen hatte ich in einem globalen Skript auch eine Variable angelegt.
Diese war nun auch global zur Verfügung.
Ich denke aber, dass dies nicht so gut ist, wenn man eine in vielen Skripten zu Zwischenspeicherung (in meinem Fall zur Erzeugung eines zusammengesetzten Steines)
Die gleiche Variable nutzt, d es hier bei überschneidenden Aufrufen zu Problemen kommen kann, oder was meint ihr?
Ich dachte es wäre vielleicht besser die variablen Lokal in den Skripten mit
let zu geklärten und global auch nur mit let in den jeweilige. Functions.Oder was meint ihr dazu?
-
@ben1983 Variablen sollten grundsätzlich vom Scope, also dem Gültigkeitsreich, her so tief wie möglich definiert werden, damit es nicht zu irgendwelchen ungewollten Überscheidungen kommt.
Wenn du also eine Variable (bzw. deren Inhalt) nur in einer Funktion brauchst, dann deklarierst du sie mit
let
innerhalb der Funktion. Wenn sie z.B. nur in einem if-Block gebraucht wird, dann deklarierst du sie in diesem Block, usw..Für Variablen, denen ein Mal ein Wert zugewiesen und nicht wieder geändert wird, sollte man zudem anstelle von
let
besserconst
verwenden. Dies definiert die Variable als Konstant und lässt keine späteren (oftmals unbeabsichtigten) Änderungen zu.
Achtung: Wenn du ein Objekt alsconst
deklarierst, kannst du trotzdem noch die Eigenschaften (Properties) des Objektes ändern. Gleiches gilt für Arrays.Früher wurden in JavaScript alle Variablen mit
var
deklariert, wodurch sie immer global wurden. Generell sollte heutzutagevar
nicht mehr genutzt werden und stattdessen nur nochlet
undconst
. -
@crycode Ja, das sind auch die beiden, die ich nutze.
ich hatte jetzt bspw. eine variable, welche ich innerhalb eines if blockes verwendet habe und dann nochmal innerhalb eines anderen if blockes.
hatte diese außerhalb mit let deklariert, damit ich es nur einmal deklarieren musste.
Denke aber die sauberere Variante ist diese innerhalb jedes blockes zu deklarieren.Innerhalb der functionen würde ich mir die Daten dann per parameter übergeben und nicht global irgenwo drauf zugreifen.
Ist der Gedanke so richtig /nachvollziehbar?Die Objekte, welche Global sind, kann man ja sowieso mit creatobject anlegen.
-
@ben1983 Genau so
-
@crycode jetzt habe ich alle Ids, welche auf die iobroker objekte zugreifen in ein globales skriptgepackt.
Komischerweise können jetzt andere globale skriptenicht darauf zugreifen, ist das normal?
Also das würde ja bedeuten, dass ich die global mehrfachdeklarieren muss. das kann doch nicht sein, oder?Edit: Also in den nicht globalen Skripten bekommt man keine rote Markierung unter die global deklarierten Variablen gesetzt.
Nun in den Globalen Skripten bekommt man Variablen, welche in einem anderen globalen Skript deklariert wurden rot markiert.
Allerdings auch nur markiert und die Autovervollständigung funktioniert dort nicht.
--> Funktionsfähig sind diese skripte jedoch.
Ist dieser offensichtliche "Anzeige Bug" bekannt? -
@ben1983 Ich denke das ist normal und der Logik vom Javascript Adapter geschuldet.
Der Inhalt der globalen Skripte wird quasi einfach nur bei allen normalen Skripten davor gepackt, wodurch die Sachen dann eben überall verfügbar werden.
Also alles was in irgendeinem globalen Skript steht ist in allen nicht-globalen Skripten verfügbar.Eventuell kann @apollon77 dazu mehr sagen?
-
@crycode Ich habe ein Skript "global Definitions" im Ordner "global".
Darin habe ich generelle Informationen wie z.B. Energiepreis und email Adressen angelegt.
Damit muß ich nicht in jedem Skript die emailadressen im Klartext schreiben, sondern kann dann z.B.const emailFrom = globalEmailFrom; const emailTo = globalEmailTo;
deklarieren.
Damit muß nicht in jedem Skript der Klartext stehen, aber es wird klar, daß die Adressen innerhalb des Skripts benötigt werden.
Ich war auch versucht, allgemeine functions wie z.B. "Ist die Uhrzeit innerhab eines bestimmten Zeitbereichs" in diesem globalen Skript zu definieren.Aber in bin bei diesen globalen Skripten sehr vorsichtig. Schließlich werden bei einer Änderung an dem globalen Skript ALLE anderen Skripte neu gestartet, weil das globale Skript davor "geklebt" wird. Das ist lästig.
So gesehen ist es wohl deutlich besser und flexibler solche Daten wie Energiepreise und emailadressen irgendwo in die Objektstruktur zu packen. Entweder unter 0_userdata oder ein alias.
-
@klassisch ich habe ein Skript für die Object IDs, welche ich in vielen Skripten nutze.
Zusätzlich habe ich Skripte, welche Funktionen enthalten, welche ich auch in mehreren Skripten nutze. Somit muss ich diese nicht mehrfach deklarieren. -
@crycode naja der Editor kann nicht wissen das später bei der Ausführung andere globale Skripte davor sind und daher Variablen verfügbar sind die sonst nicht da sind.