Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. JS variablen lieber lokal als global

    NEWS

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    • Minor js-controller 7.0.7 Update in latest repo

    JS variablen lieber lokal als global

    This topic has been deleted. Only users with topic management privileges can see it.
    • Ben1983
      Ben1983 last edited by

      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?

      crycode 1 Reply Last reply Reply Quote 0
      • crycode
        crycode Developer @Ben1983 last edited by

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

        Ben1983 1 Reply Last reply Reply Quote 1
        • Ben1983
          Ben1983 @crycode last edited by 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.

          crycode 1 Reply Last reply Reply Quote 0
          • crycode
            crycode Developer @Ben1983 last edited by

            @ben1983 Genau so 🙂

            Ben1983 1 Reply Last reply Reply Quote 1
            • Ben1983
              Ben1983 @crycode last edited by 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?

              crycode 1 Reply Last reply Reply Quote 0
              • crycode
                crycode Developer @Ben1983 last edited by

                @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 apollon77 2 Replies Last reply Reply Quote 0
                • K
                  klassisch Most Active @crycode last edited by

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

                  Ben1983 1 Reply Last reply Reply Quote 0
                  • Ben1983
                    Ben1983 @klassisch last edited by

                    @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 Reply Quote 0
                    • apollon77
                      apollon77 @crycode last edited by

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

                      1 Reply Last reply Reply Quote 0
                      • First post
                        Last post

                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      953
                      Online

                      31.6k
                      Users

                      79.5k
                      Topics

                      1.3m
                      Posts

                      4
                      9
                      581
                      Loading More Posts
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes
                      Reply
                      • Reply as topic
                      Log in to reply
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                      The ioBroker Community 2014-2023
                      logo