Ergebnis 1 bis 6 von 6
Like Tree1Likes
  • 1 Post By tsseh

Thema: Schreibweise

  1. #1
    psygonis ist offline Jungspund
    registriert
    08-07-2014
    Beiträge
    17

    Schreibweise

    was genau ist eigentlich der unterschied zwischen

    function test(string){alert(string);}

    und

    var test = function(string){alert(string);}

    nur die Schreibweise oder steckt da mehr dahinter?
    Geändert von mikdoe (24-03-2017 um 00:29 Uhr) Grund: code tags, gelöst

  2. #2
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.273

    AW: Schreibweise

    1. ist eine Function Definition, 2. ein Function Statement

    Der Unterschied ist, dass Statements nicht gehoistet werden.

  3. #3
    psygonis ist offline Jungspund
    registriert
    08-07-2014
    Beiträge
    17

    AW: Schreibweise

    Zitat Zitat von Dormilich Beitrag anzeigen
    Der Unterschied ist, dass Statements nicht gehoistet werden.
    Und was genau bedeutet das?

  4. #4
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.273

  5. #5
    psygonis ist offline Jungspund
    registriert
    08-07-2014
    Beiträge
    17

    AW: Schreibweise

    danke

  6. #6
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.598

    AW: Schreibweise

    Zitat Zitat von Dormilich Beitrag anzeigen
    Der Unterschied ist, dass Statements nicht gehoistet werden.
    nur variable werden gehoistet(wenn sie nicht mit let deklariert werden)! und das sowohl bei functiondeklarations als auch bei functionexpressions, sowie allen anderen variablen. nur werden bei der functiondeklaration, die variablen auch gleich zugewiesen, weil es im gegensatz zu anderen variablen keine explizite zuweisung gibt. das passiert bei der functionexpression, wenn man den optionalen identifer angibt nur deswegen nicht, weil die expression noch nicht ausgewertet wurde. das passiert erst bei der zuweisung

    Code:
    var a = 0;
    var b = 0;
    var c = 0;
    (function()
    {
      d();      // zugriff auf gehoistete und zugewiesene variable d
      d = 1;    // zugriff auf gehoistete und zugewiesene variable d wird überschrieben
      // d();   // fehler: "not a function" d ist ab hier keine function mehr
      // e();   // fehler: "not a function" e ist nur gehoistet aber nicht zugewiesen
      e = 1;    // zugriff auf gehoistete variable e
      // f();   // fehler: "not defined" f ist noch nicht bekannt, da die expression noch nicht ausgewertet wurde
      // f = 1; // fehler: "not defined" f ist noch nicht bekannt, da die expression noch nicht ausgewertet wurde
      a = 1;    // zugriff auf gehoistete variable
      // b = 1; // Fehler, b wird nicht gehoistet
      c = 1;    // zugriff auf globale variable
      var a = 2;// hier erfolgt die zuweisung
      let b = 2;// hier erfolgt die zuweisung
      function d() // hier gibt es keine zuweisung
      {
        alert("d: gehoistet");
      }
      // d();   // fehler: "not a function" d wurde oben überschrieben
      var e = function f() // hier erfolgt die zuweisung auf d und damit wird die expression ausgewertet und e erzeugt
      {
        //
      }
    })();
    alert(a);    // a wurde nicht verändert, da oben in der funktion auf die gehoistete variable zugegriffen wurde
    alert(c);    // c wurde verändert, da oben in der funktion auf die globale variable zugegriffen wurde

    der eigentliche existentzgrund/unterschied zu einer functiondeklaration ist ja der, dass du eine functionexpression überall dort verwenden kannst, wo eine expression erwartet wird, was eigentlich überall der fall ist.
    im gegensatz dazu dürfen functiondeklarations (eigentlich) nur auf der obersten ebene eines scopes stehen.
    sprich
    Code:
    function xxx()
    {
       // beliebige Statements ...
       function yyy()   // functiondeklaration, hier erlaubt
       {
          // ...
       }
       // beliebige Statements ...
       { // Block statement, if, for, ...
          function zzz()   // das ist in js eigentlich überhaupt nicht erlaubt, weil weder eine functiondeklaration 
                               // noch eine functionexpression welche mit function beginnt hier erlaubt ist.
                               // die meisten js-engines tolerieren das aber
          {
             // ...
          }
       }
    }
    allerdings haben sie die functionexpressions in js vermasselt, weil man sie nicht immer von einer functiondeklaration unterscheiden kann. damit können sie parserkonflikte nicht auflösen und haben die functionexpression wenn sie mit dem schlüsselwort function beginnt explizit verboten auf oberster ebene eines expressionstatements (ein expressionstatement darf nicht mit dem schlüsselwort function beginnen). du kannst sie aber in eine andere expression kapseln.

    Code:
    // ...
    {
      function() // das geht nicht
      {
         // ...
      }();
    }
    // aber in jeder anderen expression kannst du sie verwenden
    {
      var a = function() {return 1;}() + function() {return 2;}();
      // oder
      if (function() {return 1;}())
      {
    
      }
      // oder den fall von oben nur gekapselt
      (function() 
      {
         // ...
      })();
    }
    Geändert von tsseh (24-03-2017 um 10:29 Uhr)
    mikdoe likes this.

Ähnliche Themen

  1. richtige schreibweise
    Von KAINYOSH im Forum JavaScript
    Antworten: 2
    Letzter Beitrag: 08-08-2011, 18:03
  2. Datepicker deutsche Datum Schreibweise
    Von Kafkagirl im Forum JavaScript
    Antworten: 3
    Letzter Beitrag: 14-12-2009, 11:59
  3. andere schreibweise
    Von ambience im Forum JavaScript
    Antworten: 13
    Letzter Beitrag: 08-08-2007, 15:57
  4. in JS HTML-Code ausgeben (richtige schreibweise)
    Von scraddy im Forum JavaScript
    Antworten: 5
    Letzter Beitrag: 06-03-2006, 19:06
  5. Schreibweise im Script
    Von Hawk63 im Forum JavaScript
    Antworten: 3
    Letzter Beitrag: 06-04-2005, 13:14

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •