Dieter: Kommata / Semikolon Fehler

Hey Leute,
und zwar habe ich folgendes Problemchen. Ich bin auf dieses Skript gestoßen:

  
      function Time()  
      {  
      var d = new Date(),  
        daysShort = ["Sun", "Mo", "Tue", "Wed", "Thu", "Fri", "Sat"],  
        mounthShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],  
        hours = d.getHours(),  
        ampm = hours >= 12 ? 'PM' : 'AM', str;  
      hours = hours % 12;  
      hours = hours ? hours : 12;  
      str = daysShort[d.getDay()] + ', ' + mounthShort[d.getMonth()] + ' ' + d.getDate() + ', ' + hours + ':' + d.getMinutes() + ' ' + ampm;  
window.alert(str);  
      setTimeout(Time, 30000);  
      }  

Die Sache ist die: Wenn man die Kommata der ersten 4 Anweisungen in ein Semikolon ändert funktioniert das Skript irgendwie nicht mehr...
Nun würde ich gerne wissen warum man dort jetzt Kommata setzen muss (anstatt wie üblicherweise nach Anweisungen ein Semikolon).

Soviel wie ich weiß kann man Kommata benutzen wenn man mehrere Variablen auf einmal einführen möchte. Das  'var'  gibt ja an, dass es sich bei "var d = new Date()" um eine lokale Variable handelt.. Wird dieses 'var' dann auch auf die folgenden Anweisungen übertragen wenn man Kommata verwendet?

Grüße,
 Dieter

  1. Hallo,

    Das  'var'  gibt ja an, dass es sich bei "var d = new Date()" um eine lokale Variable handelt..

    Genau. Es ist eine Grundregel der JavaScript-Programmierung, möglichst lokale anstatt globale Variablen zu erzeugen.

    Wird dieses 'var' dann auch auf die folgenden Anweisungen übertragen wenn man Kommata verwendet?

    Ja, diese Zuweisungen sind dann ebenfalls Deklarationen von lokalen Variablen.

    var foo = 1, bar = 2, …; ist das sogenannte Variablen-Statement. Es lassen sich mehrere Variablen durch Komma getrennt notieren, und mit dem Zuweisungsoperator lässt sich ihnen direkt ein Wert zuweisen.

    Nur deklarieren:

    var foo, bar, qux;

    Bar wird ein Wert zugewiesen:

    var foo, bar = 1, qux;

    Das entspricht jeweils drei separaten Variablen-Statements. Das heißt, es ist austauschbar mit:

    var foo;  
    var bar = 1;  
    var qux;
    

    Lässt du das Komma weg, kann es einen Referenzfehler geben. Wenn nicht, dann werden globale Variablen erzeugt.

    Drei lokale Variablen:

    var foo = 1,  
      bar = 2,  
      qux = 3;
    

    Fehler:

    var foo;   // Sollte ein Komma sein  
      bar = 2; // Erzeugt globale Variable  
      qux;     // ReferenceError: qux kann nicht gefunden werden
    

    Eine lokale Variable, zwei globale:

    var foo = 1; // Sollte ein Komma sein  
      bar = 2;   // Dito, globale Variable  
      qux = 3;   // Global
    

    Komma vergessen kann auch zu globalen Variabl führen:

    var foo = 1  // Komma fehlt, also fügt der JS-Parser ein Semikolon ein  
      bar = 2,   // Globale Variable  
      qux = 3;   // Dito
    

    Solche Fehler kann man vermeiden, indem man konsequent im ECMAScript-5-Strict-Mode arbeitet.

    Beispiel:

    var registerVariables = function() {  
      // Aktiviere Strict-Mode  
      'use strict';  
      var foo = 1; // Hier sollte ein Komma stehen  
        bar = 2;   // <- wirft einen ReferenceError, weil eine globale Variable erzeugt werden würde  
      // Wird nicht mehr ausgeführt:  
      alert(foo + bar);  
    };
    

    Im Strict Mode lassen sich globale Variablen nur explizit mit window.globaleVariable = 'wert' erzeugen.

    Mathias

    1. Hallo,

      Das  'var'  gibt ja an, dass es sich bei "var d = new Date()" um eine lokale Variable handelt..

      Genau. Es ist eine Grundregel der JavaScript-Programmierung, möglichst lokale anstatt globale Variablen zu erzeugen.

      Wird dieses 'var' dann auch auf die folgenden Anweisungen übertragen wenn man Kommata verwendet?

      Ja, diese Zuweisungen sind dann ebenfalls Deklarationen von lokalen Variablen.

      Ahaaa.. Danke, hast du klasse und verständlich rübergebracht! Top!

      Grüße,
        Dieter

  2. Hi,

    mounthShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],

    Kleiner Hinweis am Rande: Monat schreibt sich englisch month, also ohne u.

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
  3. Erst mal Lob an molily für seinen Beitrag!

    Ich wollt noch wissen warum das mit ; nicht geht. Genau genommen liegts an der Zeile

    ampm = hours >= 12 ? 'PM' : 'AM', str;

    Die legt gleich zwei Variablen fest, nämlich ampm und str. Aber nur wenn var für diese Zeile noch gilt (Komma in den vorigen). Ohne var ist das eine eigenständige Anweisung und somit ungültig.
    Das Script ist gruslig! Gewöhn dich lieber nicht an diesen Stil. Zum Beispiel das hier:

    hours = hours ? hours : 12;

    Furchtbar! Ich hab lange überlegt bis mir klar wurde was das macht. Das ist zum protzen gut, aber nicht um jemandem was zu erklären und auch nicht für Dinge die man selber irgendwann wieder verstehen will ;-)

    1. Mahlzeit,

      Das ist zum protzen gut

      Nicht wirklich, das macht Sinn, wenn man wirklich jedes überflüssige Byte einsparen will. Solche Konstrukte können ein Script um 10-20% (oder noch mehr) verkürzen und damit die Ladezeit optimieren.

      --
      42
    2. N’Abend!

      hours = hours ? hours : 12;
      Furchtbar! Ich hab lange überlegt bis mir klar wurde was das macht.

      Wie würdest du es schreiben? So?

      if (!hours) hours = 12;

      Wenn man abkürzen will, dann wäre eher das angebracht:

      hours = hours || 12;

      Das ist in der JS-Programmierung durchaus gängig. CoffeeScript hat extra dafür einen Operator, nämlich ||=, ähnlich wie in Ruby.

      Mathias

      1. Hallo
        Viel selbsterklärender wäre ein ausdrückliches if (hour == 0) hour = 12. Aber als *produktiven* Code kann mans schon so lassen, mir ist schon bekannt dass JS zur Verringerung der Größe zusammengestaucht wird.

        Auf deinen und auch den Beitrag von M. muss ich anmerken, ich ging aufgrund Dieters Formulierung "Ich bin auf dieses Skript gestoßen" davon aus dass er diesen Code als Beispiel oder Tutorial oder was auch immer gefunden hat. Zum lernen halte ich so eine verkürzende Schreibweise nicht für geeignet, die Überlegungen über solche Konstrukte halten einen vom eigentlichen Thema ab. Kann natürlich auch sein dass der Code nicht als Anschauungsobjekt gedacht ist sondern in einer Seite auftaucht. Dann sieht es wieder ganz anders aus.