2013-03-07 5 views
5

Ich frage mich, ob ein Javascript Block/Funktion immer verfügbar ist, sobald geladen. Weil ich etwas getestet habe und jetzt bin ich ein bisschen verwirrt. Ich habe einen Skriptblock zu einem div definiert. Der Skriptblock verfügt über eine Ereignisbehandlungsfunktion für ein Element zum erneuten Laden des Div mit Ajax. Der Ajax-Aufruf gibt das einfache HTML des Divs zurück und ersetzt es durch das aktuelle. Aber es bedeutet, das Skript zu ersetzen, das die Ausführung auch macht. Ich habe mir gedacht, dass das Skript nach der replace-Anweisung nicht mehr ausgeführt werden würde. Aber es tat es nicht. Codezeilen nach replace-Anweisung wurden ausgeführt. Wie funktioniert das? Wie beschreiben Sie die Lebensdauer eines Skriptblocks?Wie kann man die Lebensdauer eines Skriptblocks oder JavaScript-Codes kennen?

Antwort

8

Wenn der in einem script-Element enthaltene Code ausgewertet wird, wird das Ergebnis dieser Codeauswertung Teil der Laufzeitumgebung der Seite. Durch Entfernen des Elements script werden die resultierenden Strukturen (Funktionen usw.) nicht aus der Umgebung entfernt.

Wenn also das Skript Funktionen definiert oder Ereignishandler an Elemente anheft oder neue Eigenschaften für vorhandene Objekte (einschließlich des globalen Objekts) erstellt, bleiben diese Funktionen, Handler und Eigenschaften im Speicher, selbst wenn script diese definiert hat aus dem DOM entfernt (vorbehaltlich der üblichen JavaScript-Speicherbereinigung; z. B. Objekte, auf die nirgendwo verwiesen wird, sind für GC geeignet, aber das script-Element hat keinen Einfluss darauf). Das script Element ist lediglich ein Mechanismus zum Übertragen des Codes an den Browser.

+0

Vielen Dank für die Antwort. Ich habe noch eine Frage. Nach dem erneuten Laden werden genau die gleichen Script-Blöcke mit exakt gleichen Funktionen geladen. Sind sie also veröffentlicht oder ersetzt oder ignoriert? –

+1

@HalilIbrahim: Der Code wird erneut ausgeführt. Wenn Sie Funktionen im globalen Gültigkeitsbereich deklariert haben, werden die bereits vorhandenen durch neue ersetzt. Wenn Sie globale Variablen * ohne * Initialisierer deklariert haben (also nur 'var foo;' nicht 'var foo = 42;'), da die Variable bereits deklariert ist, wird die zweite Deklaration ignoriert. Wenn Sie Initialisierungen oder Zuweisungen haben (zB 'var foo = 42;' oder nur 'foo = 42;'), werden diese erneut ausgeführt und 'foo' wird auf' 42' gesetzt (zurück). Usw. Alle Effekte, die den Code eine zweite (dritte, vierte) Zeit ausführen, treten auf. –

+0

@Crowder: Danke für die Antwort. –