Clemens Hofbauer: Syntax

Hallo!
Bitte kann mir jemand die Syntax von
function( ) { document.getElementById( "keyword" ).onkeyup = doSearch; }
erklären.

Vielen Dank
Clemens

  1. Hallo,

    Bitte kann mir jemand die Syntax von
    function( ) { document.getElementById( "keyword" ).onkeyup = doSearch; }
    erklären.

    Das ist eine sogenannte Function-Expression.

    Man kann Funktionen auf verschiedene Art notieren. Und da Funktionen nichts anderes als Objekte sind, die an anderen Objekten als Eigenschaften bzw. Methoden hängen, kann man Funktionsobjekte auch überall speichern - genauso wie z.B. eine String-Variable.

    function ( …Parameter… ) { …Körper… } ist einfach ein Ausdruck, der ein Funktion-Objekt zurückgibt. Er kann überall notiert werden, wo Ausdrücke erlaubt sind, zum Beispiel:

    alert(function () {});
    alert( typeof(function () {}) );

    Man kann das Ergebnis des Ausdrucks dann z.B. in irgendeiner Variable bzw. Eigenschaft speichern.

    var meinefunktion = function () { window.alert("Hallo Welt!"); };
    alert(typeof meinefunktion);

    Auf globaler Ebene, also außerhalb von Funktionen, sind folgende Schreibweisen identisch:

    function meinefunktion (param) {
       alert("Hallo Welt!");
    }

    var meinefunktion = function (param) {
       alert("Hallo Welt!");
    };

    var meinefunktion = new Function(param, 'alert("Hallo Welt!");');

    Das von dir gefundene function () { document.getElementById( "keyword" ).onkeyup = doSearch; } ist also nur ein bloßer Ausdruck. Wenn man den in einer Zeile als Expression Statement notiert, macht er überhaupt nichts:

    function () { document.getElementById( "keyword" ).onkeyup = doSearch; };

    Hat keinerlei Wirkung. Genauso wie jeder andere Ausdruck (ohne den Zuweisungs-Operator):

    1 + 1;
    Tut für sich genommen auch nichts.

    Function-Expressions machen also nur Sinn, wenn man mit dem Ergebnis des Ausdrucks etwas anfängt, z.B. das Function-Objekt an eine andere Funktion übergibt oder es in einer Variable speichert.

    Relativ üblich ist:

    window.onload = function () {
       …mach was…
    };

    Das kann man auch ohne Function-Expression schreiben, dann nutzt man ein gewöhnliches Function-Statement:

    function init () {
       …mach was…
    }
    window.onload = init;

    Soweit erst einmal – Function-Expressions erfüllen noch viele andere Aufgaben. Allerdings sind sie nicht immer nötig, wenn sie verwendet werden, meistens reicht das gewöhnliche function Funktionsname () {} aus, also das Statement, nicht die Expression.

    Mathias

    1. Super, danke für die tolle Antwort.

      LG
      Clemens

  2. Hallo,

      
    function( )  
    {  
      document.getElementById( "keyword" ).onkeyup = doSearch;  
    }  
    
    

    Das ist eine Funktion, die beim Aufruf dem HTML-Element mit
    der ID "keyword" einen onkeyup-Eventhandler verpasst, der
    entweder, für den Fall, dass in deinem Beispiel die Klammern
    hinter doSearch fehlen sollten, die Funktion doSearch() aufruft
    oder, nehmen wir an, dein Quellcode sei korrekt so, gleich der
    Variable doSearch gesetzt wird. Für den letzteren Fall kann
    ich allerdings recht wenig sagen, da ich den Inhalt von doSearch
    nicht kenne und ferner auch nicht weiß, ob doSearch vielleicht
    einen Methodenaufruf beinhalten kann, bzw. ob JavaScript so
    etwas überhaupt unterstützt.

    Dude

    1. Hallo,

      function( )
      {
        document.getElementById( "keyword" ).onkeyup = doSearch;
      }

      
      >   
      > Das ist eine Funktion, die beim Aufruf dem HTML-Element mit der [ID "keyword"](http://de.selfhtml.org/javascript/objekte/document.htm#get_element_by_id) einen [onkeyup-Eventhandler](http://de.selfhtml.org/javascript/sprache/eventhandler.htm#onkeyup) verpasst  
        
      Wie im anderen Posting gesagt tut dieser Code für sich genommen gar nichts. Funktionen haben Namen. Diese Funktion hat keinen, man wird sie also (auf dem üblichen Wege) nicht aufrufen können. Daher: Function-Expression.  
        
      
      > der entweder, für den Fall, dass in deinem Beispiel die Klammern  
      > hinter doSearch fehlen sollten, die [Funktion](http://de.selfhtml.org/javascript/sprache/funktionen.htm#) doSearch() aufruft  
        
      Event-Handler registriert man ohne Funktionsaufruf, siehe <https://forum.selfhtml.org/?t=126123&m=813912>.  
        
      
      > oder, nehmen wir an, dein Quellcode sei korrekt so, gleich der Variable doSearch gesetzt wird.  
        
      Die »Variable« ist eben eine Funktionm, ein Funktionsobjekt.  
        
      
      > Für den letzteren Fall kann ich allerdings recht wenig sagen, da ich den Inhalt von doSearch nicht kenne und ferner auch nicht weiß, ob doSearch vielleicht einen Methodenaufruf beinhalten kann, bzw. ob JavaScript so etwas überhaupt unterstützt.  
        
      Siehe oben.  
      Man registriert auf diese Weise Funktionen als Handler von gewissen Events. doSearch ist der Name einer Funktion und bei dieser Zuweisung wird das zugehörige Funktionsobjekt kopiert, dieses klebt dann am entsprechenden Element(knoten)objekt.  
        
      Mathias
      
      -- 
      [Visitenkarte](http://community.de.selfhtml.org/visitenkarten/view.php?key=17) · [SELFHTML Weblog](http://aktuell.de.selfhtml.org/weblog/)