carsten schlichting: objekt | neutral es?

Hallo

benutze in javascript folgenden code

aktiv1 = window.setTimeout("",....);

und

window.clearTimwout(aktiv1)

Programmiertechnisch wird manchmal

window.clearTimwout(aktiv1) aufgerufen ohne das vorher aktiv1 = window.setTimeout("",....); durchlaufen wurde.nun kommt natürlich eine fehlermeldung, das das objekt aktiv1 nicht definiert ist.

Jetzt habe ich versucht ganz am anfang des JS_codes eine objekt aktiv1 zu definieren, aber alle Versuche sind bisher gescheitert.

ist der gedanke richtig am anfang das objekt zu definieren ...

ich muß wahrscheinlich auch die eigenschaft des objektes definieren oder..?

weiß zufällig jemand wie der code lauten muß? oder wie würdet Ihr das lösen ?

carsten

  1. Hallo,
    Also ich mache das immer so (ist möglicherweise eine Anweisung zuviel dabei, weiss nicht, ob clearTimeout das Objekt wieder auf auf Null setzt, deswegen nochmal die Zuweisung nach dem clearTimeout.So tuts jedenfalls):

    var aktiv1 = null;
    aktiv1 = window.setTimeout("",....);

    und

    window.clearTimwout(aktiv1)
    aktiv1 = null;

    Grüße,
    Jörg

    1. Halt, noch was vergessen:
      Du musst natürlich prüfen, ob das folgende überhaupt gebraucht wird:

      if (aktiv1 != null) {

      window.clearTimeout(aktiv1)
      aktiv1 = null;

      }

      So, etz müssts stimmen.

      Jörg

    2. ok danke...

      werd das ausprobieren!!

      ist aktiv1 dann doch eigentlich kein objekt.... wenn du es vorher als variable definieren kannst.

      oder kann window.clearTimeout(aktiv1) sowohl objekte, als auch variablen interpretieren? oder sind variablen auch objekte??

      js script ist irgendwie wie kaugummi

      vielen Dank und viele Grüße

      carsten

      1. hi,

        ist aktiv1 dann doch eigentlich kein objekt.... wenn du es vorher als variable definieren kannst.

        Du kannst sowohl eine Variable mit einem Objekt überschreiben, als auch ein Objekt mit einer Variablen.
        Letztendlich betrachtest du ja immer nur einen beliebigen, selbstgewählten Namen - und ob und in Welcher Reihenfolge du denen mit skalaren Werten, Objektreferenz ode rsonstwas belegst, ist Javascript ziemlich wurscht.

        oder kann window.clearTimeout(aktiv1) sowohl objekte, als auch variablen interpretieren?

        Ob der Rückgabewert von setTimeout jetzt Variable oder Objekt ist, da würde ich mich nicht festlegen wollen - nennen wir es eine Referenz.

        oder sind variablen auch objekte??

        Jein.
        Irgendwie schon - aber halt auch wieder nicht so ganz :-)

        gruß,
        wahsaga

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

        oder kann window.clearTimeout(aktiv1) sowohl objekte, als auch variablen interpretieren? oder sind variablen auch objekte??

        Eigentlich gibt es keine unterscheidung zwischen "Variable" und "Objekt".

        Eine Variable ist ein "Platzhalter" mit (wie der name schon sagt) einem variablen Inhalt.
        Jeder Platzhalter hat für gewöhnlich einen Typ. In anderen Programmiersprachen muss man diesen für gewöhnlich explizit definieren (integer, float, char,...).

        JavaScript kennt aber nur zwei Formen von Datentypen:
        Objekte....und alles andere (sog. primitive Datentypen, also Zahlen, Zeichen,...)

        Auch Arrays (und ich glaube auch Strings) werden in JavaScript intern als Objekte behandelt.

        Deswegen kannst Du aber einer Variable eben irgendwas zuweisen.

        Einen primitiven Datentyp:

        var zahl = 5;
        var zeichen = 'a';
        var kommazahl = 3.546773;

        Oder ein Objekt:
        var objekt1 = new Object();
        var objekt2 = new Array();
        var objekt3 = [1,2,3,4,5];
        var objekt4 = {'name' : 'ein Objekt',  'wert': 5};
        var objekt5 = {'name' : 'ein Objekt', 'wert' : {'name':'Ein Unterobjekt', 'wert': 0;}};
        var objekt6 = {'name' : 'eine Liste', 'liste': [1,2,3,4,5]};

        usw.

        Gruesse,
        Joerg

        js script ist irgendwie wie kaugummi

        vielen Dank und viele Grüße

        carsten

        1. Hallo,

          JavaScript kennt aber nur zwei Formen von Datentypen:
          Objekte....und alles andere (sog. primitive Datentypen, also Zahlen, Zeichen,...)

          Nein. Da JavaScript praktisch keine Typdefinitionen kennt, kennt es auch keine primitiven Datentypen. Es kennt also nur Objekte, die je nach Kontext wie primitive Datentypen behandelt werden, wenn es passt (im Kontext) aber auch wieder Objekte sind.

          Einen primitiven Datentyp:

          var zahl = 5;

          //zahl ist aber jetzt _auch_ ein Number-Objekt
             //primitive Datentypen haben keine Methoden:
             alert(zahl.toFixed(3));

          var zeichen = 'a';

          //zeichen ist jetzt _auch_ ein String-Objekt
             alert(zeichen.link("http://www.google.de/"));

          var kommazahl = 3.546773;

          //kommazahl ist aber jetzt _auch_ ein Number-Objekt
             alert(kommazahl.toExponential());

          viele Grüße

          Axel

          1. Hallo,

            Nein. Da JavaScript praktisch keine Typdefinitionen kennt, kennt es auch keine primitiven Datentypen. Es kennt also nur Objekte, die je nach Kontext wie primitive Datentypen behandelt werden, wenn es passt (im Kontext) aber auch wieder Objekte sind.

            Bist Du sicher? Ich dachte bisher, dass der Objekt-Kontext für primitive Datentypen "on Demand" erzeugt wird.

            Also:
            var a = 5.466264;

            (a ist bis hierher noch kein Objekt sondern ein primitiver Datentyp)

            alert(a.toFixed(3));

            Der Parser erkennt hier, dass für die Variable a ein Objekt-Kontext benötigt wird, und konvertiert daher a in ein Objekt.

            Würde IMO Sinn machen, da es ressorcenspaarender sein dürfte, erst dann den Objekt-Kontext zu erzeugen, wenn dies nötig ist.

            Allerdings gibt es so einiges, was in der JavaScript_engine (vor allem in der IE-Umsetzung :) ) alles andere als sauber und ressourcenspaarend ist -> du könntest also recht haben.

            1. Hallo,

              Nein. Da JavaScript praktisch keine Typdefinitionen kennt, kennt es auch keine primitiven Datentypen. Es kennt also nur Objekte, die je nach Kontext wie primitive Datentypen behandelt werden, wenn es passt (im Kontext) aber auch wieder Objekte sind.

              Bist Du sicher? Ich dachte bisher, dass der Objekt-Kontext für primitive Datentypen "on Demand" erzeugt wird.

              Also:
              var a = 5.466264;

              (a ist bis hierher noch kein Objekt sondern ein primitiver Datentyp)

              alert(a.toFixed(3));

              Der Parser erkennt hier, dass für die Variable a ein Objekt-Kontext benötigt wird, und konvertiert daher a in ein Objekt.

              Ja, oder so ;-). Sprich: es könnte so sein. Mein Einwand bezog sich auf die Unterscheidung von "primitiven Datentypen" und Objekten, die so bei JavaScript auf Programmcodeebene nicht existiert. Der Programmierer kann also nicht explizit beeinflussen, ob etwas ein Objekt ist. Er kann nur einen Objekt-Kontext vermeiden und dann hoffen, dass Du recht hast ;-).

              viele Grüße

              Axel

            2. Hallo,

              var a = 5.466264;

              (a ist bis hierher noch kein Objekt sondern ein primitiver Datentyp)

              Ja, Interpreter-intern möglicherweise, der JavaScript-Programmierer kann es aber sofort wie ein Objekt verwenden - wie Axel sagt, ist es aus Sicht des Umgangs mit primitive value ein Objekt.

              Wichtig ist die Unterscheidung eigentlich nur in der Hinsicht, dass primitive values mit anderen primitive values identisch sein können, objects aber nur mit sich selbst. Das wirkt sich darin aus, das Objects als Referenzen übergeben werden, primitive values als Kopien.

              var a = "string primitive";  
              a.eigenschaft = "bla";  
                
              var b = Object("string object");  
              b.eigenschaft = "bla";  
                
              alert(typeof a + "\n" + typeof b);  
                
              function aendern (x, y) {  
               alert(x.eigenschaft + "\n" + y.eigenschaft);  
              }  
              aendern(a, b);
              

              Siehe auch </archiv/2005/9/t114730/#m732136>.

              Der Parser erkennt hier, dass für die Variable a ein Objekt-Kontext benötigt wird, und konvertiert daher a in ein Objekt.

              Ja, ein primitive value wird bei der Auswertung des Ausdrucks value.member umgewandelt: http://bclary.com/log/2004/11/07/#a-11.2.1

              Aber auch nur für diese Auswertung:

              var a = "string primitive";  
              a.eigenschaft = "wert";  
              alert(typeof a); // bleibt string, wird nicht object
              

              Mathias

              1. Hallo,

                Ja, Interpreter-intern möglicherweise, der JavaScript-Programmierer kann es aber sofort wie ein Objekt verwenden - wie Axel sagt, ist es aus Sicht des Umgangs mit primitive value ein Objekt.

                Naja, ich hatte eigentlich immer angenommen, dass es sowas wie primitive Datentypen in JavaScript gar nicht gibt. Insofern hatte ich Unrecht und Jörg hatte Recht.

                Wichtig ist die Unterscheidung eigentlich nur in der Hinsicht, dass primitive values mit anderen primitive values identisch sein können, objects aber nur mit sich selbst. Das wirkt sich darin aus, das Objects als Referenzen übergeben werden, primitive values als Kopien.

                Das bezog ich immmer auf den Kontext, aber ja, Du hast Recht, dieser Kontext ändert sich, wenn von Anfang an feststeht, dass es sich um ein Objekt handelt. Also gibt es doch einen grundsätzlichen Unterschied zwischen "Hallo Welt" und new String("Hallo Welt"), genau wie zwischen 1.234 und new Number(1.234).

                Der Parser erkennt hier, dass für die Variable a ein Objekt-Kontext benötigt wird, und konvertiert daher a in ein Objekt.

                Ja, ein primitive value wird bei der Auswertung des Ausdrucks value.member umgewandelt: http://bclary.com/log/2004/11/07/#a-11.2.1

                Aber auch nur für diese Auswertung:

                var a = "string primitive";

                a.eigenschaft = "wert";

                Offensichtlich passiert das gerade hier nicht. Die Eigenschaft wird nicht erzeugt.  
                  
                ~~~javascript
                  
                var a = "string primitive";  
                a.eigenschaft = "bla1";  
                a.methode = function() {return true;};  
                alert(typeof(a) + "\n" + a + "\n" + a.eigenschaft);  
                  
                var b = new String("string object");  
                b.eigenschaft = "bla2";  
                b.methode = function() {return true;};  
                alert(typeof(b) + "\n" + b + "\n" + b.eigenschaft);  
                  
                var c = 1.234;  
                c.eigenschaft = "bla3";  
                c.methode = function() {return true;};  
                alert(typeof(c) + "\n" + c + "\n" + c.eigenschaft);  
                  
                var d = new Number(1.234);  
                d.eigenschaft = "bla3";  
                d.methode = function() {return true;};  
                alert(typeof(d) + "\n" + d + "\n" + c.eigenschaft);  
                  
                var e = new Object(1.234);  
                e.eigenschaft = "bla3";  
                e.methode = function() {return true;};  
                alert(typeof(e) + "\n" + e + "\n" + e.eigenschaft);  
                  
                document.write("Members von a:<br>");  
                for (var e in a) document.write(e + "<br>");  
                document.write("<br>");  
                  
                document.write("Members von b:<br>");  
                for (var e in b) document.write(e + "<br>");  
                document.write("<br>");  
                  
                document.write("Members von c:<br>");  
                for (var e in c) document.write(e + "<br>");  
                document.write("<br>");  
                  
                document.write("Members von d:<br>");  
                for (var e in d) document.write(e + "<br>");  
                document.write("<br>");  
                
                

                Offensichtlich werden primitive Datentypen nur dann wie Objekte behandelt, wenn vordefinierte Methoden ihrer Objektentsprechungen (String, Number) auf sie angewandt werden. Wenn man versucht, sie wie Objekte zu erweiteren, dann misslingt dies.

                viele Grüße

                Axel

  2. hi,

    Programmiertechnisch wird manchmal
    window.clearTimwout(aktiv1) aufgerufen ohne das vorher aktiv1 = window.setTimeout("",....); durchlaufen wurde.nun kommt natürlich eine fehlermeldung, das das objekt aktiv1 nicht definiert ist.

    Jetzt habe ich versucht ganz am anfang des JS_codes eine objekt aktiv1 zu definieren, aber alle Versuche sind bisher gescheitert.

    ist der gedanke richtig am anfang das objekt zu definieren ...

    Ja - aber clearInterval kann trotzdem nur dann was damit anfangen, wenn es auch die Referenz auf ein zuvor gesetztes Intervall enthält.
    Ob letzteres der Fall ist, kannst du aber m.W. nicht genau prüfen - da hilft auch kein typeof o.ä.

    Aber wenn du in deinem Script umsichtig genug vorgehst, und es nicht zufällig mal mit etwas anderem als einem Verweis auf ein Intervall befüllst, dann sollte es ausreichen, wenn du es vorher mit false initialisiert - und dann vor dem Aufruf von clearInterval halt darauf abprüfst, dass es nicht mehr false ist.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  3. Hallo carsten.

    Nur einmal eine reine Interessensfrage:

    aktiv1 = window.setTimeout("",....);

    […]

    window.clearTimwout(aktiv1)

    Warum notiert eigentlich praktisch jeder hier das unnötige „window.“?

    Da obige beiden Methoden an das window-Objekt gekoppelt sind, kann man sie direkt und ohne Nennung des Objektes aufrufen.

    window.alert('Foo') schreibt ja auch niemand …

    Einen schönen Montag noch.

    Gruß, Ashura

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
    [HTML Design Constraints: Logical Markup]
    1. Hi,

      Warum notiert eigentlich praktisch jeder hier das unnötige „window.“?

      explicit is better than implicit.

      HTH :-)

      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
    2. Hallo,

      window.clearTimwout(aktiv1)

      Warum notiert eigentlich praktisch jeder hier das unnötige „window.“?

      Die Frage müsste anders lauten, warum nicht auch bei window.alert, window.eigene_methode, window.globale_variable? Auf die Weise sieht man sofort, dass das Objekt aus dem globalen Scope kommt. Innerhalb von Funktionen ist das sehr nützlich. Wobei man dieses Namespacing noch weiter treiben kann, indem man den globalen Namespace überhaupt nicht vollballert, sondern wieder Objekte als Container für Variablen und Methoden anlegt.

      Mathias