Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. JS variablen lieber lokal als global

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    24
    1
    1.3k

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.3k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.6k

JS variablen lieber lokal als global

Geplant Angeheftet Gesperrt Verschoben JavaScript
9 Beiträge 4 Kommentatoren 689 Aufrufe 4 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • Ben1983B Offline
    Ben1983B Offline
    Ben1983
    schrieb am zuletzt editiert von
    #1

    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?

    crycodeC 1 Antwort Letzte Antwort
    0
    • Ben1983B Ben1983

      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?

      crycodeC Offline
      crycodeC Offline
      crycode
      Developer
      schrieb am zuletzt editiert von
      #2

      @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 besser const verwenden. Dies definiert die Variable als Konstant und lässt keine späteren (oftmals unbeabsichtigten) Änderungen zu.
      Achtung: Wenn du ein Objekt als const 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 heutzutage var nicht mehr genutzt werden und stattdessen nur noch let und const.

      Meine Adapter: discord | canbus | ds18b20 | odl | radiohead

      Ben1983B 1 Antwort Letzte Antwort
      1
      • crycodeC crycode

        @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 besser const verwenden. Dies definiert die Variable als Konstant und lässt keine späteren (oftmals unbeabsichtigten) Änderungen zu.
        Achtung: Wenn du ein Objekt als const 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 heutzutage var nicht mehr genutzt werden und stattdessen nur noch let und const.

        Ben1983B Offline
        Ben1983B Offline
        Ben1983
        schrieb am zuletzt editiert von Ben1983
        #3

        @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.

        crycodeC 1 Antwort Letzte Antwort
        0
        • Ben1983B Ben1983

          @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.

          crycodeC Offline
          crycodeC Offline
          crycode
          Developer
          schrieb am zuletzt editiert von
          #4

          @ben1983 Genau so :)

          Meine Adapter: discord | canbus | ds18b20 | odl | radiohead

          Ben1983B 1 Antwort Letzte Antwort
          1
          • crycodeC crycode

            @ben1983 Genau so :)

            Ben1983B Offline
            Ben1983B Offline
            Ben1983
            schrieb am zuletzt editiert von Ben1983
            #5

            @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?

            crycodeC 1 Antwort Letzte Antwort
            0
            • Ben1983B Ben1983

              @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?

              crycodeC Offline
              crycodeC Offline
              crycode
              Developer
              schrieb am zuletzt editiert von
              #6

              @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?

              Meine Adapter: discord | canbus | ds18b20 | odl | radiohead

              K apollon77A 2 Antworten Letzte Antwort
              0
              • crycodeC crycode

                @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?

                K Offline
                K Offline
                klassisch
                Most Active
                schrieb am zuletzt editiert von
                #7

                @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.

                Ben1983B 1 Antwort Letzte Antwort
                0
                • K klassisch

                  @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.

                  Ben1983B Offline
                  Ben1983B Offline
                  Ben1983
                  schrieb am zuletzt editiert von
                  #8

                  @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.

                  1 Antwort Letzte Antwort
                  0
                  • crycodeC crycode

                    @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?

                    apollon77A Offline
                    apollon77A Offline
                    apollon77
                    schrieb am zuletzt editiert von
                    #9

                    @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.

                    Beitrag hat geholfen? Votet rechts unten im Beitrag :-) https://paypal.me/Apollon77 / https://github.com/sponsors/Apollon77

                    • Debug-Log für Instanz einschalten? Admin -> Instanzen -> Expertenmodus -> Instanz aufklappen - Loglevel ändern
                    • Logfiles auf Platte /opt/iobroker/log/… nutzen, Admin schneidet Zeilen ab
                    1 Antwort Letzte Antwort
                    0
                    Antworten
                    • In einem neuen Thema antworten
                    Anmelden zum Antworten
                    • Älteste zuerst
                    • Neuste zuerst
                    • Meiste Stimmen


                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    693

                    Online

                    32.5k

                    Benutzer

                    81.7k

                    Themen

                    1.3m

                    Beiträge
                    Community
                    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                    ioBroker Community 2014-2025
                    logo
                    • Anmelden

                    • Du hast noch kein Konto? Registrieren

                    • Anmelden oder registrieren, um zu suchen
                    • Erster Beitrag
                      Letzter Beitrag
                    0
                    • Home
                    • Aktuell
                    • Tags
                    • Ungelesen 0
                    • Kategorien
                    • Unreplied
                    • Beliebt
                    • GitHub
                    • Docu
                    • Hilfe