holger1979: Funktion erstellt eine lokale var statt in globaler zu speichern

Hallo Zusammen,

ich habe folgendes Problem:

Ich habe eine globale Variable in einem Javascript, welches ich als Headerdatei in einem anderen Javascript include.

Jetzt habe ich es nicht geschafft, diese globale Variable außerhalb der Headerdatei zu beschreiben. Ich habe es dann über eine Funktion probiert:

  
var address1 = "Please use function setAddress";  
  
function setAddress(address) {  
    address1 = address;  
}  

Rufe ich diese Funktion auf, so wird die Variable address1 innerhalb der Funktion lokal angelegt und geht natürlich sofort verloren.
Warum wird nicht in die lokale Variable geschrieben. Wie mache ich das?

Laut diversen Foren, Google und Kollegen sollte das gehen.

Vielen Dank!

  1. Hi,

    var address1 = "Please use function setAddress";

    function setAddress(address) {
        address1 = address;
    }

    
    >   
    > Rufe ich diese Funktion auf, so wird die Variable address1 innerhalb der Funktion lokal angelegt und geht natürlich sofort verloren.  
      
    das widerspricht der Theorie und der Erfahrung. Das von dir beschriebene Verhalten dürfte nur auftreten, wenn du innerhalb der Funktion eine gleichnamige Variable mit dem Keyword "var" als lokale Variable neu anlegst.  
      
    
    > Laut diversen Foren, Google und Kollegen sollte das gehen.  
      
    Ja. Ich schließe mich dieser Behauptung an.  
      
    Ciao,  
     Martin  
    
    -- 
    Ich liebe Politiker auf Wahlplakaten.  
    Sie sind tragbar, geräuschlos, und leicht wieder zu entfernen.  
      (Loriot, deutscher Humorist, †2011)  
    Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
    
  2. Ich habe eine globale Variable in einem Javascript

    Sicher?

    welches ich als Headerdatei in einem anderen Javascript include.

    Wie? Wo? Was? Headerdatei? JavaScript ist doch kein C! 😉

    Rufe ich diese Funktion auf, so wird die Variable address1 innerhalb der Funktion lokal angelegt und geht natürlich sofort verloren.

    Nö, funktioniert so wie es soll.

    Am besten postest du mal die entsprechenden Inhalte des richtigen Codes. Und auch, wie du ihn ins HTML(?) einbindest.

  3. Lieber holger1979,

    var address1 = "Please use function setAddress";

    function setAddress(address) {
        address1 = address;
    }

      
    auch nach meinem Verständnis müsste die in der Funktion setAddress verwendete Variable "address1" eine globale sein. Wenn Du mit Deinem Code-Beispiel allerdings etwas ausgelasssen hast, was aber in Deinem echten Code zu finden ist, könnte es durchaus sein, dass Deine Beobachtung mit der lokalen Variablen einen Sinn ergibt.  
      
    Daher hier ein Würgaround:  
      
    ~~~javascript
    function setAddress(address) {  
        window.address1 = address;  
    }
    

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. [latex]Mae  govannen![/latex]

      Daher hier ein Würgaround:

      [WÜRG]

      Eigentlich sollte man das nicht mal als Negativ-Beispiel posten, geschweige denn als Würgaround.

      window mit eigenen Variablen zu erweitern ist eine außerordentlich schlechte Idee, zu groß is die Gefahr, bei der Benennung vorhandene oder zukünftige Eigenschaften/Methoden zu überschreiben.

      Stur lächeln und winken, Männer!

      Kai

      --
      Array(16).join("x" - 1) + " Batman!"
      Unsere Identität entnehmen Sie bitte dem beigefügten Auszug aus den Personenstandsbüchern. Gegen die Assimilierung in unser Kollektiv ist nach dem ABGB (§666, Abs. 3/IV) kein Rechtsmittel zulässig. Wir bitten um Ihr Verständnis.
      SelfHTML-Forum-Stylesheet
      1. Hallo,

        window mit eigenen Variablen zu erweitern ist eine außerordentlich schlechte Idee, zu groß is die Gefahr, bei der Benennung vorhandene oder zukünftige Eigenschaften/Methoden zu überschreiben.

        ja und nein ...
        Immerhin sind globale Variablen in JS automatisch Eigenschaften des window-Objekts, das den globalen Scope repräsentiert.

        Selbstverständlich sind wir uns darüber einig, dass globale Variablen nur in Ausnahmefällen eine gute Idee sind.

        Ciao,
         Martin

        --
        Lebensmotto der Egoisten:
        Was ist so schlimm daran, dass jeder nur an sich selbst denkt? Dann ist doch an alle gedacht!
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. [latex]Mae  govannen![/latex]

          window mit eigenen Variablen zu erweitern ist eine außerordentlich schlechte Idee, zu groß is die Gefahr, bei der Benennung vorhandene oder zukünftige Eigenschaften/Methoden zu überschreiben.

          ja und nein ...
          Immerhin sind globale Variablen in JS automatisch Eigenschaften des window-Objekts, das den globalen Scope repräsentiert.

          Ja, und genau deshalb sollte man das nicht auch noch als Tipp (wenn auch Würgaround genannt) propagieren, unabhängig davon, ob windows explizit davorsteht oder nicht. Anfänger nehmen nämlich üblicherweise das, was (zu) funtionier(en scheint|t) statt den tatsächlichen Fehler zu beheben.

          Selbstverständlich sind wir uns darüber einig, dass globale Variablen nur in Ausnahmefällen eine gute Idee sind.

          Idealerweise keine, ggf. ein(ige wenig)e als „Namespace“. Ich bin ja ohnehin dafür, Code mögl. grundsätzlich in eine sofort ausgeführte Funktion zu packen.

          Stur lächeln und winken, Männer!

          Kai

          --
          Array(16).join("x" - 1) + " Batman!"
          „Die Borg würden nicht mal Spaß verstehen, wenn sie einen Vergnügungspark assimiliert hätten!” (B'Elanna Torres)
          SelfHTML-Forum-Stylesheet
          1. Hallo,

            Selbstverständlich sind wir uns darüber einig, dass globale Variablen nur in Ausnahmefällen eine gute Idee sind.
            Idealerweise keine, ggf. ein(ige wenig)e als „Namespace“. Ich bin ja ohnehin dafür, Code mögl. grundsätzlich in eine sofort ausgeführte Funktion zu packen.

            das kommt auf das Szenario an. Für mich ist Web-Programmierung (PHP, selten Javascript) nur ein kleiner Teil meiner Tätigkeit; bei der Entwicklung von Standalone-Applikationen im Desktop- oder Embedded-Bereich ist es aber IMO durchaus eine gute Strategie, Konfigurationsdaten global anzulegen. Immerhin handelt es sich dabei ja auch von der Idee her um Informationen von globaler Gültigkeit.

            In Javascript, wo man häufig kleine, in sich abgeschlossene Einheiten programmiert, würde ich deinen Ansatz mit anonymen, sofort-ausführenden Funktionen und darin gekapselten Daten sofort befürworten.

            Ciao,
             Martin

            --
            Datenbanken speichern keine User.
            Das liegt daran, daß Datenbanken mit der Lebensmittelversorgung für gespeicherte biologische Lebensformen derzeit noch Probleme haben.
              (Christoph Schnauß)
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            1. Hallo!

              bei der Entwicklung von Standalone-Applikationen im Desktop- oder Embedded-Bereich ist es aber IMO durchaus eine gute Strategie, Konfigurationsdaten global anzulegen.

              Baut man etwas größeres, so sind Modulsysteme sinnvoll, die letztlich alles kapseln und lediglich globale Methoden wie require() und define() (im Falle von AMD/CommonJS) definieren. Die Konfiguration wäre dann ein Modul unter vielen, ein Modul ohne Abhängigkeiten allerdings.

              Startup-Konfiguration und Seed-Daten lassen sich auch als JSON ins HTML einbetten. Dazu ist nicht unbedingt eine Variable nötig, es kann auch z.B. <script type="application/json" id="configuration">[code lang=javascript]{"foo":"bar"}</script>[/code] sein, welches vom Script dann ausgelesen wird und privat gespeichert wird.

              Grüße
              Mathias

            2. Hallo Der Martin,

              das kommt auf das Szenario an. Für mich ist Web-Programmierung (PHP, selten Javascript) nur ein kleiner Teil meiner Tätigkeit; bei der Entwicklung von Standalone-Applikationen im Desktop- oder Embedded-Bereich ist es aber IMO durchaus eine gute Strategie, Konfigurationsdaten global anzulegen. Immerhin handelt es sich dabei ja auch von der Idee her um Informationen von globaler Gültigkeit.

              darf man fragen, was du machst? Mit welcher Programmiersprache beschäftigst du dich am intensivsten? Was ist ein Beispiel für eine Standalon-App, an der du so arbeitest? Ich frage deshalb, weil ich mich seit meinem Studium vor 20 Jahren beruflich nur noch mit Skriptsprachen beschäftigt habe (allerdings ganz und gar nicht webspezifisch), und das schöne und gute, alte C++ doch hab sehr verstauben lassen. Ich würde auch gerne mal wieder die eine oder andere Desktop-App zumindest für privat entwickeln, bin mir aber in vielerlei Hinsicht nicht sicher, was genau. Mit PyQT habe ich zwar mal einige Systemtools für Unix gemacht (python + qt finde ich toll), und dann noch die eine oder andere Win-Software mit VB (graus). 2D-Games entwickel ich hobbymäßig mit Java, mehr möchte ich damit jedoch nicht machen (Swing nervt micht etwas, zumindest war es vor 10 Jahren so). Bringt Delphi was? Oder C#? Ich weiß es nicht. Wäre dann wieder nur für Windows (Ausnahme mono natürlich). Neue Games werde ich vermutlich in Blitzbasic schreiben, aber für Desktop-Apps ist das ja auch eher nichts. Was ist mit D? Hast du Erfahrung damit?

              Wäre mal dankbar für dein Feedback

              grüße
              mochse

              1. Hi,

                darf man fragen, was du machst?
                Mit welcher Programmiersprache beschäftigst du dich am intensivsten?

                Derzeit wohl PHP, aber das war im Moment nicht das Thema - ebensowenig wie die Tatsache, dass mein Schwerpunkt in letzter Zeit eher wieder im Bereich Elektronik/Hardwareentwicklung und Messtechnik liegt. Sonst hauptsächlich C, und wenn's sein muss, auch mal a bissl C++ (musste aber schon lange nicht mehr sein). Gelegentlich auch ein Mix aus C und einer Prise Assembler, vor allem im µC-Bereich.

                Was ist ein Beispiel für eine Standalon-App, an der du so arbeitest?

                Oft sind's irgendwelche Programme für den Laborbetrieb, also Erfassung, Darstellung, Auswertung und Protokollierung von Messergebnissen, oder Funktionsüberwachung von bestimmten Baugruppen. Zuletzt war's eine kundenspezifische Lösung für die Bewertung und Archivierung von BGV/A3-Wiederholungsprüfungen. Der Kunde hatte schon zwei kommerzielle Programme in engerer Wahl - das eine war sozusagen eine Sackkarre, das andere ein ausgewachsener LKW. Anstatt nun tagelang den LKW "herunterzufrisieren" oder mit dem Sackkarren-Lieferanten über zusätzliche Features zu diskutieren, habe ich schließlich ein Zwischending "nach Maß" gemacht.
                Zwischendurch kommt auch mal das eine oder andere Konsolen-Tool zur Automatisierung typischer Abläufe, oder irgendwelche systemnahen Daemons oder einfache Serverprozesse.
                Und schließlich immer mal wieder irgendwelche µC-Geschichten, die dann in komplexeren Elektronik-Produkten verbaut werden.

                Was ist mit D? Hast du Erfahrung damit?

                Nein. Mein Wissen erschöpft sich in der Feststellung, dass es diese Sprache gibt.

                Ciao,
                 Martin

                --
                Lieber Hahn im Korb, als Tiger im Tank.
                Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
          2. Lieber Kai345,

            unabhängig davon, ob windows explizit davorsteht oder nicht.

            <klugscheiss>windows != window</klugscheiss>

            Liebe Grüße,

            Felix Riesterer.

            --
            ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
            1. [latex]Mae  govannen![/latex]

              unabhängig davon, ob windows explizit davorsteht oder nicht.

              <klugscheiss>windows != window</klugscheiss>

              grins. Beides gleichermaßen überflüssig, also vielleicht doch window == windows :)

              Stur lächeln und winken, Männer!

              Kai

              --
              Array(16).join("x" - 1) + " Batman!"
              Unsere Identität entnehmen Sie bitte dem beigefügten Auszug aus den Personenstandsbüchern. Gegen die Assimilierung in unser Kollektiv ist nach dem ABGB (§666, Abs. 3/IV) kein Rechtsmittel zulässig. Wir bitten um Ihr Verständnis.
              SelfHTML-Forum-Stylesheet
      2. window mit eigenen Variablen zu erweitern ist eine außerordentlich schlechte Idee, zu groß is die Gefahr, bei der Benennung vorhandene oder zukünftige Eigenschaften/Methoden zu überschreiben.

        window mit mehr als max. einer eigenen Variablen zu erweitern...

  4. Die Funktion sowie die Variable stehen in einer Datei, nennen wir sie Header.js, die von einer anderen Datei eingebunden wird.

    import "Header.js";

    Das ganze wird dann über Json in C# verwendet.

    Wenn ich folgendes mit window probiere:

    var address1 = "Please use function setAddress";  
      
    function setAddress(address) {  
    	window.address1 = address;  
    }
    

    erhalte ich in C# eine exception:
    Reference Error: window is not defined

    Irgendein Noesis.Javascript ist in dem C#-Code eingebunden.
    Ich habe mal gegoogled. Noesis.Javascript ist ein .Net Javainterpreter.
    Anscheinend liegt das Problem darin, dass ich aus den Funktionen heraus die globalen Variablen nicht ändern kann.

    Habe aber keine Ahnung warum und wie ich das Ändern kann.

    1. Hallo,

      Das ganze wird dann über Json in C# verwendet.
      Irgendein Noesis.Javascript ist in dem C#-Code eingebunden.
      Ich habe mal gegoogled. Noesis.Javascript ist ein .Net Javainterpreter.

      Das ist eine entscheidende Information…

      erhalte ich in C# eine exception:
      Reference Error: window is not defined

      window gibt es nur in JavaScript-Implementierungen im Browser, nicht in allen ECMAScript-Umgebungen.

      window verweist auf das sogenannte globale Objekt. Das gibt es in allen ECMAScript-Umgebungen, es hat aber einen anderen Namen (oder keinen). Welchen es in Noesis.JavaScript hat, weiß ich nicht, es gibt aber einen Hinweis in der Dokumentation.

      Wie bereits gesagt, wenn du kein »var« verwendest, sollten alle Variablen global sein und damit Eigenschaften des globalen Objekts. Wenn das nicht funktioniert, könntest du versuchen, »this« zu verwenden. Das zeigt, wenn die Funktion nicht im Kontext eines anderen Objekts aufgerufen wird, auf das globale Objekt.

      this.foo = 123;  
      function show () {  
        this.foo = 345;  
      }
      

      Mathias