Gunnar Bittersmann: sauber?

0 53

sauber?

Gunnar Bittersmann
  • javascript
  1. 0
    Cheatah
    1. 0
      Gunnar Bittersmann
      1. 0
        Cheatah
        1. 0
          Gunnar Bittersmann
          1. 0
            Christian Kruse
            1. 0
              Ashura
              1. 0
                Christian Kruse
                1. 0
                  Ashura
              2. 0
                Gunnar Bittersmann
                1. 0
                  Christian Kruse
                  1. 0
                    Gunnar Bittersmann
                    1. 0
                      Christian Kruse
                      1. 0
                        Gunnar Bittersmann
                        1. 0

                          Äquivalent zu <pre>?

                          Der Martin
                          • zu diesem forum
                          1. 0
                            Gunnar Bittersmann
                            1. 0
                              Der Martin
                              1. 0
                                Gunnar Bittersmann
                        2. 0
                          Christian Kruse
                          1. 0

                            Äquivalent zu <pre>?

                            Gunnar Bittersmann
                            • zu diesem forum
                            1. 0
                              Christian Kruse
                              1. 0
                                Gunnar Bittersmann
                                1. 0
                                  Christian Kruse
                2. 0
                  Ashura
          2. 0
            Ashura
          3. 0
            Axel Richter
            1. 0
              Gunnar Bittersmann
              1. 0
                Axel Richter
    2. 0
      Christian Kruse
      1. 0
        Cheatah
        1. 0
          Christian Kruse
          1. 0
            Cheatah
            1. 0
              Christian Kruse
            2. 0
              Der Martin
  2. 0
    Gunnar Bittersmann
    1. 0
      Gunnar Bittersmann
  3. 0

    setTimeout auf welchen Wert?

    Gunnar Bittersmann
    1. 0
      Gunnar Bittersmann
    2. 0
      MudGuard
      1. 0
        Gunnar Bittersmann
    3. 0
      Der Martin
    4. 0
      wahsaga
    5. 0
      Daniel Thoma
      1. 0
        Gunnar Bittersmann
        1. 0
          Gunnar Bittersmann
          1. 0
            Daniel Thoma
          2. 1
            bernd
            1. 0
              Gunnar Bittersmann
              1. 0
                Gunnar Bittersmann
                1. 0
                  bernd
                  1. 0
                    Gunnar Bittersmann
                    1. 0
                      Gunnar Bittersmann
                    2. 1
                      bernd

Hi,
Eigentlich kein Problem, aber man kann ja eins draus machen: ;-)

function foo(date, timezone) {  
 if (timezone)  
  var date = new Date(Date.parse(date) + timezone * 3600000);  
 with (date)  
  return( /* some code */ );  
}

Wenn ein (optionaler) Parameter timezone übergeben wird und dessen Wert von 0 verschieden ist, soll das lokale date-Objekt in der with-Anweisung verwendet werden, sonst das als Argument übergebene.

Funzen tut das[tm], aber ist das sauber?

Live long and prosper,
Gunnar

--
„Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
  1. Hi,

    function foo(date, timezone) {

    [...]

    var date = [...]

    _das_ ist schon mal keine gute Idee :-)

    Wenn ein (optionaler) Parameter timezone übergeben wird und dessen Wert von 0 verschieden ist, soll das lokale date-Objekt in der with-Anweisung verwendet werden, sonst das als Argument übergebene.

    Funzen tut das[tm], aber ist das sauber?

    Frage den Wert lieber mit typeof() ab. Das verhindert ggf. auch eine Warning.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. function foo(date, timezone) {
      [...]
        var date = [...]

      _das_ ist schon mal keine gute Idee :-)

      Cheatah,
      Warum nicht? Was spricht dagegen?

      Frage den Wert lieber mit typeof() ab.

      Sollte doch in beiden Fällen derselbe sein.

      Das verhindert ggf. auch eine Warning.

      Hab noch keine bekommen. (Auch keine Warnung. ;-) SCNR.)

      Live long and prosper,
      Gunnar

      --
      „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
      1. Hi,

        function foo(date, timezone) {
          var date = [...]
        _das_ ist schon mal keine gute Idee :-)
        Warum nicht? Was spricht dagegen?

        eine Variable zu deklarieren, die schon übergeben wurde? Das fragst Du nicht wirklich, oder? ;-)

        Frage den Wert lieber mit typeof() ab.
        Sollte doch in beiden Fällen derselbe sein.

        Bis auf die Warning. Und den Typecast.

        Das verhindert ggf. auch eine Warning.
        Hab noch keine bekommen.

        Bei hinreichend strenger Konfiguration - was für die Entwicklung empfehlenswert ist - sollte Mozillas JavaScript-Konsole welche anzeigen.

        (Auch keine Warnung. ;-) SCNR.)

        Die gibt's eh nur in deutschsprachigen Browsern ;-)

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. Warum nicht? Was spricht dagegen?
          eine Variable zu deklarieren, die schon übergeben wurde? Das fragst Du nicht wirklich, oder? ;-)

          Cheatah,
          Ich tu sonst immer so klug hier; lass mich doch auch mal dummtun.

          Nachdem ich das übergebene date auf der rechten Seite von
          var date = new Date(Date.parse(date) + timezone * 3600000);
          benutzt habe, brauche ich das übergebene nicht mehr. Also warum nicht lokal eine Variable gleichen Namens anlegen?

          Frage den Wert lieber mit typeof() ab.
          Sollte doch in beiden Fällen derselbe sein.
          Bis auf die Warning.

          In der JavaScript-Konsole des Firefox’ gibt’s  keine Warnung. Hab grad keinen Mozilla da. Was sagt der?

          Und den Typecast.

          ??

          Natürlich könnte ich auch in beiden Fällen (timezone != 0 bzw. undefined oder 0) ein neues lokales Objekt erzeugen und das anders benennen. Das will ich aber gerade umgehen, da das ja im Fall undefined oder 0 nicht notwendig ist und die Ausführung unnötig verlangsamen würde. Die Funktion soll möglichst aber schnell sein.

          Zum Ansehen: http://gunnarbittersmann.de/Scripts/date.js (Wie war das mit „Den Code zu lesen und ihn zu verstehen sind fast deckungsgleich“? [Cheatah] ;-))

          Anwendung in http://gunnarbittersmann.de/2005/weltzeituhr.html

          Live long and prosper,
          Gunnar

          --
          „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
          1. 你好 Gunnar,

            Nachdem ich das übergebene date auf der rechten Seite von
            var date = new Date(Date.parse(date) + timezone * 3600000);
            benutzt habe, brauche ich das übergebene nicht mehr. Also warum nicht
            lokal eine Variable gleichen Namens anlegen?

            Das ist ein Trugschluss, das passiert nicht. Das Schlüsselwort var wird in
            diesem Fall schlicht ignoriert.

            Frage den Wert lieber mit typeof() ab.
            Sollte doch in beiden Fällen derselbe sein.
            Bis auf die Warning.

            In der JavaScript-Konsole des Firefox’ gibt’s  keine Warnung. Hab grad
            keinen Mozilla da. Was sagt der?

            Vorab: Warnings stellst du ein, wenn du in about:config
            javascript.options.strict auf true setzt. Dann: es gibt (in diesem Fall)
            keine Warning.

            再见,
             克里斯蒂安

            --
            Neue Hardware eingebaut | Der dritte mir bekannte Block-Nutzer
            Nur die Weisesten und die Dümmsten können sich nicht ändern.
            http://wwwtech.de/
            1. Hallo Christian.

              Dann: es gibt (in diesem Fall)
              keine Warning.

              Hm?

              ---
              Warnung: variable date hides argument
              Quelldatei: http://gunnarbittersmann.de/Scripts/date.js
              Zeile: 8, Spalte: 6
              Quelltext:
                var date = new Date(Date.parse(date) + tz * 3600000);

              Warnung: deprecated with statement usage
              Quelldatei: http://gunnarbittersmann.de/Scripts/date.js
              Zeile: 10, Spalte: 120
              Quelltext:
              Math.floor(a = Math.abs(tz))) < 10 ? "0" : "") + b + ":" + ((b = Math.round((a - b) * 60)) < 10 ? "0" : "") + b : "Z")));

              Warnung: assignment to undeclared variable tz
              Quelldatei: http://gunnarbittersmann.de/2005/weltzeituhr.html
              Zeile: 15

              Warnung: assignment to undeclared variable dd
              Quelldatei: http://gunnarbittersmann.de/2005/weltzeituhr.html
              Zeile: 16

              Warnung: assignment to undeclared variable utc
              Quelldatei: http://gunnarbittersmann.de/2005/weltzeituhr.html
              Zeile: 17

              Warnung: assignment to undeclared variable local
              Quelldatei: http://gunnarbittersmann.de/2005/weltzeituhr.html
              Zeile: 17

              Warnung: assignment to undeclared variable user
              Quelldatei: http://gunnarbittersmann.de/2005/weltzeituhr.html
              Zeile: 17

              Warnung: assignment to undeclared variable dateTime
              Quelldatei: http://gunnarbittersmann.de/2005/weltzeituhr.html
              Zeile: 21
              ---

              Einen schönen Sonntag noch.

              Gruß, Ashura

              1. 你好 Ashura,

                Hallo Christian.

                Dann: es gibt (in diesem Fall)
                keine Warning.

                Hm?
                […]

                Es ging doch um den Fall, ob if(timezone) eine Warning verursacht wenn
                timezone nicht definiert ist. Deine Warnings haben nichts mit diesem Fall
                zu tun.

                再见,
                 克里斯蒂安

                1. Hallo Christian.

                  Es ging doch um den Fall, ob if(timezone) eine Warning verursacht wenn
                  timezone nicht definiert ist.

                  Achso.

                  Einen schönen Sonntag noch.

                  Gruß, Ashura

              2. Warnung: variable date hides argument
                  var date = new Date(Date.parse(date) + tz * 3600000);

                OK, kommt ohne var nicht mehr.

                Warnung: deprecated with statement usage

                Heißt, dass man with überhaupt nicht mehr verwenden sollte?

                Also foo.bar(); foo.baz();
                statt with(foo) {bar(); baz();}?

                Wäre die Ausführung mit with nicht schneller? (Noch nicht getestet.)

                Warnung: assignment to undeclared variable tz
                Warnung: assignment to undeclared variable dd
                Warnung: assignment to undeclared variable utc
                Warnung: assignment to undeclared variable local
                Warnung: assignment to undeclared variable user
                Warnung: assignment to undeclared variable dateTime

                Ups, wo kommen die her? Sollte ich in Funktionen keine globalen Variablen (erstmals) setzen?

                Live long and prosper,
                Gunnar

                --
                „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
                1. 你好 Gunnar,

                  Warnung: assignment to undeclared variable tz
                  Warnung: assignment to undeclared variable dd
                  Warnung: assignment to undeclared variable utc
                  Warnung: assignment to undeclared variable local
                  Warnung: assignment to undeclared variable user
                  Warnung: assignment to undeclared variable dateTime

                  Ups, wo kommen die her? Sollte ich in Funktionen keine globalen Variablen
                  (erstmals) setzen?

                  Eine Warnung ist eine Warnung, nicht mehr und nicht weniger. Das bedeutet,
                  der Interpreter vermutet, dass da ein Fehler sein _könnte_. Es muss keiner
                  sein. Wenn du weisst, dass das so richtig ist, dann kannst du die Warnung
                  getrost ignorieren.

                  再见,
                   克里斯蒂安

                  --
                  Neue Hardware eingebaut | Der dritte mir bekannte Block-Nutzer
                  Unsere Vorstellungen von der Ewigkeit sind genauso nuetlich wie die Mutmassungen eines Kuehkens ueber die Aussenwelt bevor es die Eierschale aufbricht.
                  http://wwwtech.de/
                  1. Eine Warnung ist eine Warnung, nicht mehr und nicht weniger.

                    Da ignoriere ich doch auch glatt die Warnungen, die mir der Validator für http://gunnarbittersmann.de/2005/weltzeituhr.html wegen der "&&" im Quelltext (XHTML) ausspuckt.

                    Oder sollte ich das dann doch lieber als HTML 4.01 schreiben, wenn ich das Script nicht auslagern will?

                    Live long and prosper,
                    Gunnar

                    --
                    „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
                    1. 你好 Gunnar,

                      Eine Warnung ist eine Warnung, nicht mehr und nicht weniger.

                      Da ignoriere ich doch auch glatt die Warnungen, die mir der Validator für
                      http://gunnarbittersmann.de/2005/weltzeituhr.html wegen der "&&"
                      im Quelltext (XHTML) ausspuckt.

                      Oder sollte ich das dann doch lieber als HTML 4.01 schreiben, wenn ich
                      das Script nicht auslagern will?

                      Was spricht gegen

                      //<![CDATA[  
                      //]]>
                      

                      再见,
                       克里斯蒂安

                      --
                      Neue Hardware eingebaut | Der dritte mir bekannte Block-Nutzer
                      Es ist uns nicht möglich, in einem Bereich unseres Lebens richtig zu verhalten, wenn wir in allen anderen falsch handeln. Das Leben ist ein unteilbares Ganzes.
                      http://wwwtech.de/
                      1. Hi Christian,

                        Was spricht gegen

                        //<![CDATA[
                        //]]>

                        Ähm, weiß nicht … nichts? ;-)

                        Live long and prosper,
                        Gunnar

                        PS. Was spricht dagegen, [codе] ohne Sprachangabe für Posten im Forum ohne Warnung (diese ignoriere ich auch gerne) zuzulassen?

                        Gibt es für präformatierten Text sowas wie [prе] oder muss man dafür zum Missbauch von [codе] greifen?

                        --
                        „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
                        1. Hallo Gunnar,

                          Gibt es für präformatierten Text sowas wie [prе] oder muss man dafür zum Missbauch von [codе] greifen?

                          wozu denn noch?
                          Hier im Forum werden doch mittlerweile alle Leerzeichen und Zeilenumbrüche exakt wie eingegeben auch übernommen - was willst du noch mehr?
                          Ich erinnere mich an Zeiten (ist noch gar nicht lange her), als Leerzeichen am Zeilenanfang im Posting ignoriert wurden; das ist ja inzwischen zum Glück korrigiert worden.
                          Also wozu noch der Ruf nach <pre>?

                          So long,

                          Martin

                          1. Also wozu noch der Ruf nach <pre>?

                            Martin,
                            Um Tabellen darstellen (wie z.B. in http://forum.de.selfhtml.org/archiv/2005/10/t117410/#m752604)

                            Es soll Nutzer geben, die andere Schrift als eine diktengleiche eingestellt haben. ;-)

                            Live long and prosper,
                            Gunnar

                            --
                            „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
                            1. Hallo,

                              Um Tabellen darstellen (wie z.B. in http://forum.de.selfhtml.org/archiv/2005/10/t117410/#m752604)

                              Es soll Nutzer geben, die andere Schrift als eine diktengleiche eingestellt haben. ;-)

                              Echt?
                              Was für'n Unsinn.
                              Selber schuld...

                              Gute Nacht auch,

                              Martin

                              1. Es soll Nutzer geben, die andere Schrift als eine diktengleiche eingestellt haben. ;-)

                                Echt?

                                Ja.

                                Was für'n Unsinn.

                                Nein.

                                Selber schuld...

                                Liest sich besser. Außer eben bei Tabellen. Und bei ASCII-Art. Und bei

                                  
                                      H     H  
                                       C = C  
                                    CH3     OH  
                                
                                

                                Warum ich da nicht gleich drauf gekommen bin, http://forum.de.selfhtml.org/archiv/2005/10/t117542/#m753241 als Beispiel anzuführen … ;-)

                                Live long and prosper,
                                Gunnar

                                --
                                „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
                        2. 你好 Gunnar,

                          PS. Was spricht dagegen, [codе] ohne Sprachangabe für Posten im Forum
                          ohne Warnung (diese ignoriere ich auch gerne) zuzulassen?

                          Die Warnung ist genau das gleiche wie die Warnung eines JS-Interpreters: es
                          _könnte_ ein Fehler vorliegen. Muss aber nicht. Es ist kein Fehler, code
                          ohne lang zu posten, aber es könnte ein potentieller Fehler sein.

                          Gibt es für präformatierten Text sowas wie [prе] […]

                          Nein.

                          再见,
                           克里斯蒂安

                          --
                          Neue Hardware eingebaut | Der dritte mir bekannte Block-Nutzer
                          Sich erinnern bedeutet, aus einer Erfahrung nicht ausreichend gelernt zu haben.
                          http://wwwtech.de/
                          1. Gibt es für präformatierten Text sowas wie [prе] […]

                            Nein.

                            Christian,
                            Sollte es aber IMHO ruhig geben.

                            Es mag ja Nutzer geben, die sich auch code-Bereiche in Proportionalschrift anzeigen lassen wollen.

                            Da wären Tags [pre] [/pre], die in <pre> </pre> umgewandelt werden, doch hilfreich.

                            Wer sich pre dann anders formatiert, der ist wirklich „selber schuld“.

                            Live long and prosper,
                            Gunnar

                            --
                            „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
                            1. 你好 Gunnar,

                              Wer sich pre dann anders formatiert, der ist wirklich „selber schuld“.

                              Wer sich code anders formatiert ist genau so selber schuld. Ich halte pre
                              für völlig überflüssig.

                              再见,
                               克里斯蒂安

                              --
                              Neue Hardware eingebaut | Der dritte mir bekannte Block-Nutzer
                              Es ist uns nicht möglich, in einem Bereich unseres Lebens richtig zu verhalten, wenn wir in allen anderen falsch handeln. Das Leben ist ein unteilbares Ganzes.
                              http://wwwtech.de/
                              1. Hi Christian,

                                Wer sich code anders formatiert ist genau so selber schuld. Ich halte pre
                                für völlig überflüssig.

                                Wo bleibt denn da das „semantische Markup“? ;-)

                                Live long and prosper,
                                Gunnar

                                --
                                „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
                                1. 你好 Gunnar,

                                  Wer sich code anders formatiert ist genau so selber schuld. Ich halte
                                  pre für völlig überflüssig.

                                  Wo bleibt denn da das „semantische Markup“? ;-)

                                  Hehe, der Output der Postings ist eh nicht semantisch und wird es auch nie
                                  werden (könne) ;)

                                  再见,
                                   克里斯蒂安

                                  --
                                  Neue Hardware eingebaut | Der dritte mir bekannte Block-Nutzer
                                  Wenn du gehst, gehe. Wenn du sitzt, sitze. Und vor allem: schwanke nicht!
                                  http://wwwtech.de/
                2. Hallo Gunnar.

                  Warnung: deprecated with statement usage

                  Heißt, dass man with überhaupt nicht mehr verwenden sollte?

                  Ich habe diese Meldung noch ein paar Mal finden können, jedoch keine Begründung.
                  Möglicherweise hängt es einfach nur mit sauberem Stil zusammen.

                  Also foo.bar(); foo.baz();
                  statt with(foo) {bar(); baz();}?

                  Wäre die Ausführung mit with nicht schneller? (Noch nicht getestet.)

                  Je nach Umfang der abzuarbeitenden Befehle kann erstere Schreibweise sicher schneller sein, aber auch ich habe es nicht getestet.

                  Warnung: assignment to undeclared variable tz
                  Warnung: assignment to undeclared variable dd
                  Warnung: assignment to undeclared variable utc
                  Warnung: assignment to undeclared variable local
                  Warnung: assignment to undeclared variable user
                  Warnung: assignment to undeclared variable dateTime

                  Ups, wo kommen die her? Sollte ich in Funktionen keine globalen Variablen (erstmals) setzen?

                  Laut Warnungen ja.

                  Einen schönen Sonntag noch.

                  Gruß, Ashura

          2. Hallo Gunnar.

            In der JavaScript-Konsole des Firefox’ gibt’s  keine Warnung.

            Dann wechsele einmal zum Strict-Mode:

            about:config
             -> javascript.options.strict = true

            Einen schönen Sonntag noch.

            Gruß, Ashura

          3. Hallo,

            Nachdem ich das übergebene date auf der rechten Seite von
            var date = new Date(Date.parse(date) + timezone * 3600000);
            benutzt habe, brauche ich das übergebene nicht mehr. Also warum nicht lokal eine Variable gleichen Namens anlegen?

            Warum nicht einfach den Wert des übergebenen Parameters ändern? Lass das "var" doch einfach weg. Es gibt die Variable "date" bereits im Gültigkeitsbeich der Funktion.

            viele Grüße

            Axel

            1. Axel,

              Hallo,

              Nachdem ich das übergebene date auf der rechten Seite von
              var date = new Date(Date.parse(date) + timezone * 3600000);
              benutzt habe, brauche ich das übergebene nicht mehr. Also warum nicht lokal eine Variable gleichen Namens anlegen?

              Warum nicht einfach den Wert des übergebenen Parameters ändern? Lass das "var" doch einfach weg.

              Ich hatte gedacht, damit eine außerhalb der Funktion vorhandene Variable date zu überschreiben …

              Es gibt die Variable "date" bereits im Gültigkeitsbeich der Funktion.

              … aber nein, date ist lokal.*

              Das war es, was Chetah mir sagen wollte?

              Live long and prosper,
              Gunnar

              * Von Sprachspielereien abgesehen:
                   • date ist temporal
                   • Ist doch klar, dass man sich an einem Ort trifft; wären zwei an verschiedenen Orten, hätten sie ja kein Date.
                   • …

              --
              „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
              1. Hallo,

                Ich hatte gedacht, damit eine außerhalb der Funktion vorhandene Variable date zu überschreiben …

                Nein, dazu müsstest Du window.date ansprechen.

                … aber nein, date ist lokal.*

                Nein, es liegt im Gültigkeitsbereich der Funktion. Ganz JavaScript ist lokal, oder? ;-)

                • Ist doch klar, dass man sich an einem Ort trifft; wären zwei an verschiedenen Orten, hätten sie ja kein Date.

                Nein, aber eventuell zwei?

                F: Wie viele Männer sprechen nach dem Geschlechtsverkehr mit ihrer Frau?
                A: Das hängt hauptsächlich davon ab, ob ein Telefon in der Nähe ist.

                viele Grüße

                Axel

    2. 你好 Cheatah,

      function foo(date, timezone) {
      [...]
        var date = [...]

      _das_ ist schon mal keine gute Idee :-)

      In JS ist das möglich und hat auch keine unangenehmen Nebeneffekte. Es gibt
      keinen tieferen Scope als den Funktions-Scope. Es ist allerhöchstens
      stilistisch gesehen nicht die feine englische Art.

      再见,
       克里斯蒂安

      --
      Neue Hardware eingebaut | Der dritte mir bekannte Block-Nutzer
      Wenn der Schüler bereit ist, erscheint der Meister.
      http://wwwtech.de/
      1. Hi,

        In JS ist das möglich und hat auch keine unangenehmen Nebeneffekte.

        bis auf die Warnings. Man kann natürlich immer sagen, dass sie ja nur warnen sollen - richtig, nämlich vor eventuell schwerwiegenden Fehlern. Wer eine Variable deklariert, die schon deklariert ist, macht in aller Regel[1] etwas anderes als das, was er eigentlich will.

        Cheatah

        [1] Gegenbeispiel: Schleifenvariable.

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. 你好 Cheatah,

          Hi,

          In JS ist das möglich und hat auch keine unangenehmen Nebeneffekte.

          bis auf die Warnings.

          Ich sagte ja: es ist höchstens stilistisch ein Fehler. Es hat keine
          Nebeneffekte („var variable“ ändert den Wert nicht). Das einzige, was auf
          ein logisches Problem hindeutet, ist das Schlüsselwort „var“.

          Wer eine Variable deklariert, die schon deklariert ist, macht in aller
          Regel[1] etwas anderes als das, was er eigentlich will.
          […]
          [1] Gegenbeispiel: Schleifenvariable.

          Auch hier wäre das strengenommen der gleiche potentielle Fehler. Jemand,
          der eine bestehende Schleifen-Variable neu deklariert, hat keinen Überblick
          darüber, welche Variablen er in seinem Code-Stück verwendet.

          再见,
           克里斯蒂安

          1. Hi,

            Ich sagte ja: es ist höchstens stilistisch ein Fehler.

            richtig :-)

            Es hat keine Nebeneffekte („var variable“ ändert den Wert nicht).

            Interessant, dass Du erst sagst, es gäbe keine Nebeneffekte, und dann gleich einen nennst. Bei der Deklaration einer Variable kann man erwarten, dass sie mit einem definierten Initialwert gefüllt wird.

            Jemand,
            der eine bestehende Schleifen-Variable neu deklariert, hat keinen Überblick
            darüber, welche Variablen er in seinem Code-Stück verwendet.

            Jein. Ein

            for (var i=0; i<irgendwas; i++)

            geht relativ routiniert von der Hand und ist i.d.R. auch nicht besonders bemerkenswert. Wenn nun in der selben Code-Ebene eine weitere Schleife folgt, erachte ich eine Redeclaration als ziemlich natürlich. Ich stehe immer wieder vor dem Zwiespalt, die Warning zu ignorieren oder den eher unintuitiven Code ohne Deklaration zu wählen.

            Cheatah

            --
            X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
            X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
            X-Will-Answer-Email: No
            X-Please-Search-Archive-First: Absolutely Yes
            1. 你好 Cheatah,

              Es hat keine Nebeneffekte („var variable“ ändert den Wert nicht).

              Interessant, dass Du erst sagst, es gäbe keine Nebeneffekte, und dann
              gleich einen nennst.

              Ein Nebeneffekt wäre es, wenn die Variable mit ihrem Initialwert befüllt
              würde: es wird ein Status geändert. Ich mache ja schliesslich eine
              Deklaration, keine Initialisierung.

              Bei der Deklaration einer Variable kann man erwarten, dass sie mit einem
              definierten Initialwert gefüllt wird.

              Nein, bei einer Deklaration hat der Inhalt gefälligst nicht geändert zu
              werden. Das muss bei einer Initialisierung passieren.

              Jein. Ein

              for (var i=0; i<irgendwas; i++)

              geht relativ routiniert von der Hand und ist i.d.R. auch nicht besonders
              bemerkenswert. Wenn nun in der selben Code-Ebene eine weitere Schleife
              folgt, erachte ich eine Redeclaration als ziemlich natürlich.

              Ja, da hast du recht.

              Ich stehe immer wieder vor dem Zwiespalt, die Warning zu ignorieren oder
              den eher unintuitiven Code ohne Deklaration zu wählen.

              Ich ignoriere die Warnings in diesem Fall grundsätzlich, da bei einer
              späteren Änderung die erste Schleife eventuell entfallen könnte. Und damit
              hätte man dann einen hausgemachten Bug.

              再见,
               克里斯蒂安

              --
              Neue Hardware eingebaut | Der dritte mir bekannte Block-Nutzer
              Kommt ein Vektor zur Drogenberatung: "Hilfe, ich bin linear abhaengig!"
              http://wwwtech.de/
            2. Hi,

              Bei der Deklaration einer Variable kann man erwarten, dass sie mit einem definierten Initialwert gefüllt wird.

              nein, das erwarte ich erst bei der Initialisierung oder Definition (Deklaration und Intitialisierung in einer Anweisung).

              Wenn nun in der selben Code-Ebene eine weitere Schleife folgt, erachte ich eine Redeclaration als ziemlich natürlich. Ich stehe immer wieder vor dem Zwiespalt, die Warning zu ignorieren oder den eher unintuitiven Code ohne Deklaration zu wählen.

              Da bin ich als gewohnheitsmäßiger C-Programmierer ganz anders geprägt. Am Anfang eines neuen Scopes (i.d.R. Funktionskopf) wird eine Variable deklariert, und dann kann ich sie innerhalb des Scopes beliebig oft wiederverwenden. Dabei muss ich selbst darauf achten, ob ich die bisher zugewiesenen Werte überschreiben will/darf oder nicht.
              Mich stört schon die Schlampigkeit, die mit C++ eingeführt wurde, dass man neue Variablen an jeder Stelle im Programmcode deklarieren kann.

              Schönen Abend noch,

              Martin

  2. Hi,
    Das liebe ich an diesem Forum: Man stellt eine Frage und bekommt auch noch gleich zehn andere beantwortet. Schade eigentlich, dass viele N00bs und Ewig-N00bs das nicht als Vorteil erkennen.

    Dank euch ist das var jetzt weg (Nun sollte es sauber sein?) und meine JavaScript-Konsole zeigt auch Warn_u_ngen an. :-) Danke.

    Durch erzwungenes Mitdenken ist mir noch aufgefallen, dass ich
        date = new Date(Date.parse(date) + tz * 3600000);
    ja gar nicht brauche. Es geht schnell und einfach
        date += tz * 3600000;

    Live long and prosper,
    Gunnar

    PS. Das Debuggen bei verschachtelten bedingten Zuweisungen (foo ? (bar ? baz : quz) : quuz) und Zuweisungen in Operationen (foo = (bar = baz + quz) + quuz) ist eine Katastrophe!

    Vielleicht hätte ich den Link zum vollständigen Script nicht posten sollen, sondern ein Rätsel zum Wochenende draus machen?

    --
    „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
    1. Durch erzwungenes Mitdenken ist mir noch aufgefallen, dass ich
          date = new Date(Date.parse(date) + tz * 3600000);
      ja gar nicht brauche. Es geht schnell und einfach
          date += tz * 3600000;

      Was immer mich in diesen Wahnsinn trieb …

      Gibt es eine bessere Möglichkeit, tz Stunden zum Zeitpunkt date zu addieren (wobei tz auch negativ sein kann) als
          date = new Date(Date.parse(date) + tz * 3600000);?

      Live long and prosper,
      Gunnar

      PS. Da ich sowieso die if (tz)-Abfrage in der Funktion toISO8601String() hatte, hab ich den bedingten Ausdruck noch in zwei kürzere geteilt …

      --
      „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
  3. Hi,
    No ’ne Frage zu Uhrzeitanzeigescripts.

    Hypothetische Annahme: Es gibt sinnvolle Anwendungen. ;-)

    Disclaimer: Die Weltzeituhr-Seite war eigentlich nur zum Testen der
        toISO8601String()-Funktion gedacht. Ist dann etwas mehr Spielerei draus geworden.

    function foo() {  
      refreshDisplay();  
      window.setTimeout("foo()", 1000);  
    }
    

    braucht ja zum Ausführen von refreshDisplay() etwas Zeit, sagen wir 42 ms. Der Aufruf von foo() – die Aktualisierung der Zeitanzeige – ist also nicht jede Sekunde, sondern alle 1042 ms.

    Ruft man foo() erstmals um 00:00:00.000 auf, erfolgen die weiteren Aufrufe
    00:00:01.042
    00:00:02.084
    00:00:03.126
    [gähn]
    00:00:22.924
    00:00:23.966
    00:00:25.008
    Die Uhrzeitanzeige springt also von 00:00:23 auf 00:00:25.

    Setzt man den Timeout kürzer, sagen wir 950 ms (bei 42 ms für foo()):
    00:00:00.942
    00:00:01.884
    00:00:02.826
    [gähn]
    00:00:16.014
    00:00:16.956
    00:00:17.898
    Die Anzeige verweilt fast zwei Sekunden lang auf 00:00:16.

    Die Anpassung der Länge des Timeouts (window.setTimeout("foo()", 968);) ist ja nicht wirklich eine Lösung, da die 42 ms für ein bestimmtes System gelten; auf anderen sind es mehr oder weniger.

    Das Auffrischen der Anzeige alle Zehntelsekunde ist wohl Verschwendung von Rechenleistung. Interupt-gesteuerte Funktionsaufrufe gibt’s wohl in JavaScript nicht.

    Muss man also mit Unregelmäßigkeiten bei der Anzeige (manche Sekunden doppelt oder übersprungen) leben?

    Live long and prosper,
    Gunnar

    --
    „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
    1. Ehe ich zum Nachsitzen verdonnert werde:

      Setzt man den Timeout kürzer, sagen wir 950 ms (bei 42 ms für foo()):
      00:00:00.942
      00:00:01.884
      00:00:02.826

      Ich wollte es erst für 950 ms rechnen, hab’s dann aber für 900 ms getan und vergessen, das oben abzuändern.

      Die Anpassung der Länge des Timeouts (window.setTimeout("foo()", 968);) ist ja nicht wirklich eine Lösung,

      Zumal 1000 - 42 = 958.

      Live long and prosper,
      Gunnar

      --
      „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
    2. Hi,

      function foo() {

      refreshDisplay();
        window.setTimeout("foo()", 1000);
      }

      
      > braucht ja zum Ausführen von `refreshDisplay()`{:.language-javascript} etwas Zeit, sagen wir 42 ms. Der Aufruf von `foo()`{:.language-javascript} – die Aktualisierung der Zeitanzeige – ist also nicht jede Sekunde, sondern alle 1042 ms.  
        
      setInterval?  
        
      cu,  
      Andreas
      
      -- 
      [Warum nennt sich Andreas hier MudGuard?](http://www.Mud-Guard.de/)  
      [Schreinerei Waechter](http://www.schreinerei-waechter.de/)  
        
      Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.  
      
      
      1. setInterval?

        Andreas,
        Die Beschreibung in SELFHTML liest sich erstmal gut.

        Die Implementierung hält jedoch nicht was die Beschreibung verspricht: Die Anzeige stockt noch mehr als bei setTimeout (Firefox, IE).

        Live long and prosper,
        Gunnar

        --
        „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
    3. Moin Gunnar,

      Hypothetische Annahme: Es gibt sinnvolle Anwendungen. ;-)

      okay, mal angenommen. ;-)

      function foo() {

      refreshDisplay();
        window.setTimeout("foo()", 1000);
      }

      
      >   
      > braucht ja zum Ausführen von `refreshDisplay()`{:.language-javascript} etwas Zeit, sagen wir 42 ms. Der Aufruf von `foo()`{:.language-javascript} – die Aktualisierung der Zeitanzeige – ist also nicht jede Sekunde, sondern alle 1042 ms.  
        
      In solchen Fällen tendiere ich dazu, den neuen Aufruf der Funktion schon zu "bestellen", bevor ich die eigentliche Arbeit erledige:  
        
      
      > ~~~javascript
      
      function foo() {  
      
      >   window.setTimeout("foo()", 1000);  
      >   refreshDisplay();  
      > }
      
      

      So geht der Zeitbedarf von refreshDisplay() nicht mehr in die Intervallzeit ein. In der wirklichen Welt muss man dann auf mögliche Rekursionen achten; u.U. hat es böse Folgen, wenn die Funktion "sich selbst überholt". Ob das im Zusammenhang mit setTimeout() in einer Browserumgebung auch problematisch ist, weiß ich nicht; ich vermute nein.

      Das ändert aber nichts daran, dass ein Browser nun mal keine typische Echtzeitanwendung ist und somit schon vom OS kein garantiertes Zeitverhalten für sich beanspruchen kann. Browserinterne Scripts können sich also noch weniger darauf verlassen, dass Timerfunktionen pünktlich aufgerufen werden. Bei hoher Systemauslastung kann es schon mal sein, dass sich der Aufruf um ein paar Sekunden verspätet.

      Daher erscheint es mir müßig, solche Zeitanzeige-Scripts nur der flüssigen Anzeige wegen auf eine Zehntelsekunde oder noch besser zu optimieren.

      Schönen Tag noch,

      Martin

    4. hi,

      abgesehen von Andreas' Hinweis auf setInterval -

      Muss man also mit Unregelmäßigkeiten bei der Anzeige (manche Sekunden doppelt oder übersprungen) leben?

      erwartest du wirklich Betrachter, die minutenlang mit solcher Faszination auf eine Uhrzeitanzeige starren werden, so dass ihnen dieses Phänomen überhaupt auffällt ...?

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
    5. Hallo Gunnar,

      Rechne doch einfach aus, in wie vielen Millisekunden die Sekunde abläuft.
      Die Zeit, die Du brauchst, um das auszurechnen, fällt sicher nicht ins Gewicht.
      Die Lösung hat auch den Vorteil, dass die Anzeige wirklich beim Sekundenwechsel aktualisiert wird.

      Grüße

      Daniel

      1. Rechne doch einfach aus, in wie vielen Millisekunden die Sekunde abläuft.

        Hi Daniel,
        Ich war erstmal recht skeptisch, aber mal sehen …

        Die Zeit, die Du brauchst, um das auszurechnen, fällt sicher nicht ins Gewicht.

        Hm, immerhin ein zusätzlicher Aufruf von new Date().

        Du meintest das doch so in der Art?

        function insertDateTime() {  
          dateTime = new Date();  
          utc.nodeValue = toISO8601String(dateTime, 0);  
          local.nodeValue = toISO8601String(dateTime);  
          user.nodeValue = toISO8601String(dateTime, tz);  
          execTime = new Date().getTime() - dateTime.getTime();  
          window.setTimeout("insertDateTime()", 1000 - execTime);  
        }
        

        JavaScript mag vorgaukeln, in Millisekunden zu rechnen, nimmt’s aber doch nicht so genau: alert (execTime) ergibt entweder 0 oder 50.

        Aber dennoch läuft die Zeitanzeige damit stabiler, es gibt zwar hin und wieder noch Hopser, aber es sind weniger.

        Gar nicht so dumm. :-)

        Live long and prosper,
        Gunnar

        --
        „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
        1. Aber dennoch läuft die Zeitanzeige damit stabiler, es gibt zwar hin und wieder noch Hopser, aber es sind weniger.

          … anzusehen auf http://gunnarbittersmann.de/2005/weltzeituhr-20051031.html

          Live long and prosper,
          Gunnar

          --
          „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
          1. Hallo Gunnar,

            Sieht gut aus, bei mir hopst da auch nichts. Die Uhr läuft sehr schön Synchron mit meiner Rechneruhr.

            Grüße

            Daniel

          2. Hallo,

            wollte nur anmerken, falls es noch keinem aufgefallen ist, dass der
            Aufruf von insertDateTime bei onclick und jetziger Implementation der
            Funktion (ständiges setTimeout), nicht so ideal ist;)

            bernd

            1. wollte nur anmerken, falls es noch keinem aufgefallen ist, dass der
              Aufruf von insertDateTime bei onclick und jetziger Implementation der
              Funktion (ständiges setTimeout), nicht so ideal ist;)

              bernd,
              Du meinst, wenn um 00:00:04.2 das onclick-Ereignis eintritt, dass dann insertDateTime() zweimal pro Sekunde aufgerufen wird?

              00:00:05.0
              00:00:05.2
              00:00:06.0
              00:00:06.2
              00:00:07.0
              00:00:07.2

              Ist das so?

              Live long and prosper,
              Gunnar

              --
              „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
              1. Du meinst, wenn um 00:00:04.2 das onclick-Ereignis eintritt, dass dann insertDateTime() zweimal pro Sekunde aufgerufen wird?
                Ist das so?

                Ja, das ist so. Und das ist schlecht.

                Ich hatte anfangs auch nur onclick="[code lang=javascript]tz++"[/code] bzw. onclick="[code lang=javascript]tz--"[/code] da zu stehen. Dann erfolgt die Reaktion auf die Nutzeraktion im worst case aber erst eine Sekunde später; das ist inakzeptabel. (http://gunnarbittersmann.de/2005/weltzeituhr-20051030.html hab ich auf diesen Stand zurückversetzt.)

                In http://gunnarbittersmann.de/2005/weltzeituhr-20051031.html lass ich jetzt beim Click auf die Buttons nur einmalig die Zeitanzeige in der gewählten Zeitzone ändern.

                Vielen Dank für den Hinweis.

                Live long and prosper,
                Gunnar

                --
                „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
                1. Hallo,

                  ja wunderbar. Eine Frage noch, bringt es was, wenn man den
                  nächsten Aufruf so berechnet, dass er genau eine Sekunde
                  nach dem jetzigen erfolgt?

                    
                  window.setTimeout("insertDateTime()", 1000 - (new Date().getTime()) + dateTime.getTime());  
                  
                  

                  Wäre es nicht sinnvoller, den nächsten Aufruf so zu berechnen,
                  dass die Funktion beim nächsten Sekundenwechsel aufgerufen wird.

                    
                  window.setTimeout("insertDateTime()", 1000 - (new Date()).getMiliseconds());  
                  
                  

                  Ist nur so ein Gedanke gewesen, weil mir oben aufgefallen ist, dass
                  sich auch negative Werte ergeben könnnten (unwahrscheinlich aber möglich).

                  bernd

                  1. Wäre es nicht sinnvoller, den nächsten Aufruf so zu berechnen,
                    dass die Funktion beim nächsten Sekundenwechsel aufgerufen wird.

                    window.setTimeout("insertDateTime()", 1000 - (new Date()).getMiliseconds());

                    Ja, bernd,
                    Das war’s wohl auch, was [Daniel] meinte.

                    Aktuelle Version: http://gunnarbittersmann.de/2005/weltzeituhr-20051101.html

                    Live long and prosper,
                    Gunnar

                    PS. Unterscheidet sich window.setTimeout("insertDateTime()", 1000 - (new Date().getMiliseconds())); (schließende Klammer an anderer Stelle) in der Ausführung in irgendeiner Weise?

                    --
                    „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
                    1. PS. Unterscheidet sich window.setTimeout("insertDateTime()", 1000 - (new Date().getMiliseconds())); (schließende Klammer an anderer Stelle) in der Ausführung in irgendeiner Weise?

                      (Davon abgesehen, dass die Methode getMiliseconds() unbekannt ist, um MudGuard zuvorzukommen ;-))

                      Live long and prosper,
                      Gunnar

                      --
                      „Weisheit ist nicht das Ergebnis der Schulbildung, sondern des lebenslangen Versuchs, sie zu erwerben.“ (Albert Einstein)
                    2. Hallo,

                      PS. Unterscheidet sich window.setTimeout("insertDateTime()", 1000 - (new Date().getMiliseconds())); (schließende Klammer an anderer Stelle) in der Ausführung in irgendeiner Weise?

                      so wie du es geschrieben hast gibt es keinen gravierenden Unterschied.
                      Anders sieht es aus, wenn du dem Konstruktor keine Parameter übergibst und
                      auch die Klammern wegläßt, was ja legitim ist.

                        
                      alert((new Date).getMilliseconds()); // OK  
                      alert(new Date.getMilliseconds());   // Fehler  
                      
                      

                      Beim ersten Beispiel ist es halt eindeutig, dass auf eine Methode der
                      neuen Instanz von Date zugegriffen werden soll. Beim zweiten gibt's einen
                      Fehler, da es keine statische Methode getMilliseconds gibt bzw. genauer
                      gesagt die Vorlage für den Konstruktor fehlt (siehe weiter unten).

                        
                      Date.getMilliseconds = function()  
                      {  
                        return 42;  
                      }  
                        
                      alert(Date.getMilliseconds())        // 42  
                      alert(new Date.getMilliseconds())    // 42?  
                      alert((new Date).getMilliseconds()); // Die aktuellen Millisekunden  
                      
                      

                      Wenn man das mal laufen läßt wird man feststellen, dass im zweitem Beispiel
                      ein Objekt zurückgeliefert wird, nicht aber die Zahl 42. Warum?

                      Der new-Operator bewirkt ja folgendes:

                      1. Es wird eine Instanz von Object erzeugt
                      2. Es wird anschließend der Konstruktor für das Objekt aufgerufen. Der Konstruktor
                         ist ja eine Funktion die als Vorlage dient wobei auf das erzeugte Objekt über
                         den this-Zeiger zugegriffen werden kann.
                      3. Der Konstruktor initialisiert das Objekt mit den übergebenen Werten (Parameter).
                         Soll heißen, dass die Werte aus der Parameterliste über den this-Zeiger der neuen
                         Instanz zugewiesen werden können. Ist unwichtig steht aber so in der Doku;)

                      Im zweiten Beispiel wird also in Schritt 2 für den Konstruktor (Vorlage)
                      "Date.getMilliseconds" aufgelöst und die letzte Klammer stellt die Parameterliste
                      für selbigen dar.

                        
                      // Konstruktor im zweiten Beispiel.  
                      function()  
                      {  
                        return 42;  
                      }  
                      
                      

                      Ändern wir mal diesen "Konstruktor" und nutzen Parameter für
                      die Initialisierung.

                        
                      Date.getMilliseconds = function(name)  
                      {  
                        this.name = name;  
                        return 42; // Rückgabewerte im Konstruktor haben keine Bedeutung  
                      }  
                        
                      alert(new Date.getMilliseconds("Gunnar").name); // "Gunnar"  
                      
                      

                      So, ich hoffe das war so korrekt und verständlich. Bin mir sicher dass du das so auch
                      schon vermutet hast aber die Nachwelt soll ja auch was zum lesen haben.

                      bernd