NEWS
JS/TS Variablen Scope
-
Moin,
ich möchte von Anfang an für Ordnung und Lesbarkeit in meinen Skripten sorgen.
Hier mal ein Beispiel:// Skript A const FOO_BAR = "javascript.0.foo.bar."; log(FOO_BAR);
Das klappt auch prima.
Jetzt habe ich ein zweites Script, welches auch den Namespace "javascript.0.foo.bar" nutzen will.
// Skript B const FOO_BAR = "javascript.0.foo.bar."; log(FOO_BAR);
Hier bekomme ich beim Speichern folgende Fehlermeldung:
14:38:57.580 error javascript.0 (3737) script.js.test.foo: TypeScript compilation failed: const FOO_BAR = "javascript.0.foo.bar."; ^ ERROR: Cannot redeclare block-scoped variable 'FOO_BAR'.
Lasse ich im zweiten Script die erste Zeile weg, kommt folgender Fehler:
14:34:40.899 error javascript.0 (3737) script.js.test.foo: script.js.test.foo:3 14:34:40.900 error javascript.0 (3737) at script.js.test.foo:3:5
Beide Skripte liegen im selben Ordner.
Wie ist hier denn der Scope für die Skripte? Am liebsten wäre es mir, wenn ich ein Skript habe, in dem nur die Konstanten für die Namespaces definiert sind, die innerhalb eines Ordners genutzt werden. -
Ich gebe mir hier mal selbst eine Antwort:
Basierend auf der Beschreibung zu den Globals in der iobroker.javascript doku klappt das auch mit Variablen.
Ich habe im Order global eine neue Datei mit folgendem Inhalt angelegt:let FOO_BAR = "javascript.0.foo.bar.";
Jetzt kann ich aus meinem Skript heraus wie folgt auf die Variable zugreifen:
log(FOO_BAR);
Leider klappt das ganze nicht, wenn ich statt let const benutze. Das wäre mir hier eigentlich noch lieber. Sollte ich dazu noch was finden, melde ich mich. Ansonsten falls jemand anders noch weiß, wie das mit const klappt, immer her mit dem Tipp!
-
@Sternmiere Bei mir gab es auch das Problem dass ich nicht die gleichen Variablennamen in verschiedenen Skripten benutzen konnte.
Das ist mit diesem Commit gelöst:
https://github.com/ioBroker/ioBroker.javascript/commit/9a384be909c5437bfac2cd5d23348bf57f4f8e2eOb die globals wie gewohnt weiterhin funktionieren habe ich nicht getestet, weil ich das nicht für TS benutze.
-
@Sternmiere also wenn du beie scripte unter globals angelegt hast dann geht das nicht da ein global scrippt IMMER vor JEDEM script drangehangen wird und somit hättest du 2 mal die gleiche Variable deklariert.. besonderheit bei global
hier kannst du aber funktionen die für jedes andere script erreichbar sind plazieren..
in unterscripten geht das
-
@arteck said in JS/TS Variablen Scope:
in unterscripten geht das
Aber gleiche Variablenbezeichner gehen innerhalb common erst seit dem genannten Commit bzw. 4.7.0, davor ging es in meinen Tests eben nicht.