Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
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

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    15
    1
    213

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    4.4k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.3k

JS variablen lieber lokal als global

Scheduled Pinned Locked Moved JavaScript
9 Posts 4 Posters 709 Views 4 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Ben1983B Offline
    Ben1983B Offline
    Ben1983
    wrote on last edited by
    #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 Reply Last reply
    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
      wrote on last edited by
      #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 Reply Last reply
      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
        wrote on last edited by 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 Reply Last reply
        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
          wrote on last edited by
          #4

          @ben1983 Genau so :)

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

          Ben1983B 1 Reply Last reply
          1
          • crycodeC crycode

            @ben1983 Genau so :)

            Ben1983B Offline
            Ben1983B Offline
            Ben1983
            wrote on last edited by 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 Reply Last reply
            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
              wrote on last edited by
              #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 Replies Last reply
              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
                wrote on last edited by
                #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 Reply Last reply
                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
                  wrote on last edited by
                  #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 Reply Last reply
                  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
                    wrote on last edited by
                    #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 Reply Last reply
                    0
                    Reply
                    • Reply as topic
                    Log in to reply
                    • Oldest to Newest
                    • Newest to Oldest
                    • Most Votes


                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    561

                    Online

                    32.7k

                    Users

                    82.4k

                    Topics

                    1.3m

                    Posts
                    Community
                    Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                    ioBroker Community 2014-2025
                    logo
                    • Login

                    • Don't have an account? Register

                    • Login or register to search.
                    • First post
                      Last post
                    0
                    • Home
                    • Recent
                    • Tags
                    • Unread 0
                    • Categories
                    • Unreplied
                    • Popular
                    • GitHub
                    • Docu
                    • Hilfe