.nils.: Frage zu eval()

Beitrag lesen

Hallo,

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.

also, ich habe es mal getestet.
Wenn ich eine funktion abc() habe und dann alert(abc) ausführe, kriege ich den Code der Funktion augegeben. Wenn ich andere Objekte ausgebe, bekomme ich meist "[Object]" geliefert. Liege ich da richtig, das es sich beim Ausgeben des Funktionscodes um den Prototyp/(sozusagen eine "Klasse") handelt und sonst um eine Objektinstanz? Diese Frage wäre mir sehr wichtig, weißt Du eine Antwort?

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.

Das ist mir glasklar.

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.

Glasklar.

Also ist ein Methodenaufruf kein "atomares" Element der Programmlogik (wenn man mal von den einzelnen Buchstaben absieht) sondern er besteht aus einer Variable (in diesem Fall "abc") die ein (prototypisches?) Funktionsobjekt (genauer eine Referenz auf ein Funktionsobjekt) enthält.
Außerdem einem nachgeordneten Operator "()", der bewerkstelligt, das das Funktionsobjekt/(der Quellcode), auf das die vorangestellte Variable zeigt, ausgeführt wird.

Ehrlich gesagt (wenn das stimmt), finde ich das so elementar wichtig, das ich es mir in Selfhtml gewünscht hätte. Ich habe bisher immer zwischen Eigenschaften und Methoden unterschieden. Wenn es so ist, dann gibt es nur Eigenschaften. Und der Methodenaufruf ist nur eine spezielle, auf eine Eigenschaft angewandte Operation.

Wieso ist das im Javascript-code so komisch geregelt, im Html-Quelltext geht es aber?

Wie meinst du das?

Im Html-Quelltext:

  
<body onload="tuedies(parameterA, parameterB, parameterC)">... <!-- Das geht, direkter Methodenaufruf -->  

Im Javascript-Code:

  
window.onload=tuedies(parameterA, parameterB, parameterC);.../* Das geht nicht, warum? Warum kann man nicht auch hier direkt eine Funktion aufrufen? */  
window.onload=tuedies;.../* Das geht wiederum */  

Das meine ich. Ist mir aber mittlerweile nicht mehr so wichtig, weil ich wenigstens verstehen beginne, was es ist. Dann ist das Warum nicht so wichtig (Obwohl es seltsam ist).

p.s.
@Selfhtml:
"Beachten Sie, dass hier nur der Funktionsname stehen darf, kein Funktionsaufruf mit runden Klammern dahinter."

Das befriedigt mich _ganz und gar_ nicht. ;-)

Gruß, Nils