molily: Frage zu eval()

Beitrag lesen

Hallo,

// abc() ist eine Funktion.
(element).onclick = abc;             //geht
(element).onclick = abc();           //geht nicht
(element).onclick = abc(p1, p2, p3); //geht nicht


>   
> ich dachte ich hätte irgendwo (auf Struppis Seite?) gelesen, ohne die Klammern, wäre es eine Referenz auf den Funktionsinhalt, nicht auf den eigentlichen Rückgabewert der Funktion. Das checke ich noch nicht so recht.  
  
Ich verstehe deine Frage nicht recht. Dass »abc()« die Funktion ausführt (sog. Call-Operator), während die reine Nennung von »abc« nur dazu führt, dass in diesem Ausdruck das Funktionsobjekt eingesetzt wird, wurde ja schon erklärt.  
  
Funktionen sind wie gesagt Objekte, Objekte liegen im Speicher. Um auf sie später zugreien zu können, speichert man sie unter (erst einmal) einem Namen. Ein Objekt kann aber auch unter mehreren Namen gespeichert werden, das hat globes Beispiel ja gezeigt. Und wenn ein Objekt unter einem weiteren Namen (d.h. in einer »Variablen« oder in einer Objekteigenschaft) gespeichert wird, wird nur ein weiterer Alias, eben eine Referenz erzeugt. All diese Namen zeigen auf dasselbe Objekt.  
  
Wenn man schreibt  
element.onclick = abc;  
dann wird in der Eigenschaft onclick keine Kopie (kein Klon, keine Verdoppelung) des Funktionsobjekts gespeichert, sondern nur eine Referenz. Beide Namen verweisen auf dieselbe Speicherstelle, auf dasselbe Objekt.  
  

> Wieso ist das im Javascript-code so komisch geregelt, im Html-Quelltext geht es aber?  
  
Wie meinst du das?  
  
Mathias