Ich weiß, dass diese Frage dumm sein könnte, möchte nur wissen, und ich bin mir nicht sicher, ob das Thema zu meiner aktuellen Frage passt. Aber immer noch gedacht, es zu fragen.
%Vor%Ich sehe die erste "Funktion" wird nicht beim Laden oder Aktualisieren der Seite ausgelöst, sondern als zweite fire () ausgelöst wird Wenn die Seite geladen wird, wird diese Funktion später beim Klicken nicht ausgelöst. Ich bin verwirrt, brauche nur Klarstellungen in diesem.
Der zweite wird sofort ausgelöst, weil Sie die Klammer ()
verwendet haben. Wenn Sie einer vorhandenen Funktion einen Ereignishandler zuweisen, dürfen Sie die Klammern nicht verwenden.
Was passiert, ist, dass die Funktion sofort ausgeführt wird und der Rückgabewert als Event-Handler zugewiesen wird.
Um es zu veranschaulichen, ist es dasselbe wie:
%Vor% Wie Sie sehen können, wird undefined
als Event-Handler übergeben.
Sie müssen fire
an onclick
als Funktionsreferenz und nicht als Aufruf übergeben.
Wenn Sie fire()
an den onclick-Handler übergeben, wird dieser sofort ausgelöst, und der Rückgabewert der Funktion ist auch der, auf den Sie klicken. Wenn ein Verweis auf die Funktion übergeben wird, wird die Ausführung gestoppt, bis das Ereignis ausgelöst wird. Es ist im Wesentlichen das gleiche wie die anonyme Funktion Handler oben.
rlemon war nett genug, um dir eine schöne Demonstration zu machen Geige & lt; - hier
Ich möchte auch noch ein paar weitere Dinge hinzufügen.
Denken Sie zunächst an onclick
als gewöhnliche Eigenschaft eines Objekts.
Also, object.onclick = value
wo value = functionName()
ist
vollkommen in Ordnung, zum Beispiel könnte functionName()
einen Wert zurückgeben
mit return something;
Aber onclick
ist keine gewöhnliche Eigenschaft. Wenn JS-Engine im Browser
trifft Zuordnungen zu ereignisbasierten Eigenschaften (z. B. onclick
, ondblclick
, onmouseover
usw.), erstellt für jeden einen Stapel
Element, bestehend aus Mapping s / w
onSomeEvent und -Handler
Der Handler ist ein Funktionsobjekt. Aber wenn du sowas tust
element.onSomeEvent = functionName();
Sie rufen einfach den
Funktion functionName()
und das wäre in Ordnung gewesen, wenn
functionName()
wurde als
Aber weil functionName
in Ihrem Fall keine Funktion zurückgibt, sehen Sie ein unerwartetes Ergebnis. Das ist das Wichtigste
Nachteil von Sprachen wie JavaScript. In einer stark typisierten Sprache hätte das
einen Fehler geworfen ... weil
Tags und Links javascript html html5