Die grundlegenden Typwerte sind: undefiniert, Null, Boolesche, Anzahl und String. Diese Typen belegen einen Speicherplatz fester Größenspeicher und ihre Werte werden im Stapelraum gespeichert, auf den wir nach Wert zugreifen.
(1) Werttypen: numerisch, boolean, null, undefiniert.
(2) Referenztyp: Objekt, Array, Funktion.
Wenn der zugewiesene Wert ein Referenztyp ist, muss der Speicherplatz für diesen Wert im Heap -Speicher zugewiesen werden. Da die Größe solcher Werte nicht festgelegt ist (Objekte haben viele Eigenschaften und Methoden), können sie nicht auf Stapelspeicher gespeichert werden. Die Speicheradressgröße ist jedoch behoben, sodass die Speicheradresse im Stapelspeicher gespeichert werden kann.
<script type = "text/javaScript"> var box = new Object (); // Erstellen Sie einen Referenztyp var box = "Lee"; // Der Grundtypwert ist das String -Box.age = 23; // Es ist seltsam, den grundlegenden Typenwerten Attribute hinzuzufügen, da nur Objekte Attribute hinzufügen können. alarm (box.age); // Es ist kein Referenztyp und kann nicht ausgegeben werden. </Script>
Kurz gesagt, der Heap -Speicher speichert Referenzwerte und der Stapelspeicher werden festgelegte Typwerte gespeichert.
<script type = "text/javaScript"> var Man = new Object (); // Man zeigt auf die räumliche Adresse des Stack Memory Man.Name = "Jack"; var Man2 = MAN; // MAN2 erhält die Adresse des Zeigenallers des Menschen (Man2.Name); // Beide Pop -Up Jack Alert (Man.Name); </script>
Variablenwerte kopieren
Schauen wir uns das folgende Beispiel an:
<script type = "text/javaScript"> var Man = new Object (); // Man zeigt auf die räumliche Adresse des Stack Memory Man.Name = "Jack"; var Man2 = MAN; // MAN2 erhält die Adresse der Zeigenadresse des Menschen Man2.name = "ming"; // Weil sie alle auf dasselbe Objekt und denselben Namen zeigen, egal wer geändert wird, hat jeder Alert (Man2.Name);
Aus dem obigen können wir sehen, dass der Grundtyp und der Referenztyp auch in Bezug auf das variable Kopieren unterschiedlich sind. Der Grundtyp kopiert den Wert selbst, während der Referenztyp die Adresse kopiert.
Parameter übergeben
In ECMascript werden alle Funktionsparameter von Werten übergeben.
<script type = "text/javaScript"> Funktionsfeld (num) {// Num nach Wert num+= 10; Rückgabe num; } var num = 10; var result = box (num); Alarm (Ergebnis); // Wenn es mit Referenz übergeben wird, wird die Num in der Funktion zu einer globalen Variablen, und die Nummer außerhalb wird durch Alarm (Num) ersetzt. // Mit anderen Worten sollte 20 am Ende ausgegeben werden (10 wird hier ausgegeben) </script>JavaScript wird nicht mit Referenz übergeben. Bei einer Referenz sind die Variablen in der Funktion globale Variablen und können auch extern zugegriffen werden. Aber das ist offensichtlich unmöglich.
Ausführungsumgebung und Umfang
Die Ausführungsumgebung ist eines der wichtigsten Konzepte in JavaScript. Die Ausführungsumgebung definiert Variablen oder Funktionen, die die Erlaubnis haben, auf andere Daten zuzugreifen.
Die globale Ausführungsumgebung ist die periphere Ausführungsumgebung. In einem Webbrowser ist die globale Ausführungsumgebung ein Fensterobjekt. Daher werden alle Funktionen globaler Variablen als Eigenschaften und Windows -Methoden erstellt.
<script type = "text/javaScript"> var name = "Jack"; // Globale Variablenfunktion definieren setName () {return "trigkit4"; } alert (window.name); // Globale Variable, die äußerste, gehört zum Fensterattributalarm (window.setName ()); // Globale Funktion, die äußerste, gehört zur Fenstermethode </script>Wenn der Code in der Ausführungsumgebung ausgeführt wird, wird die Umgebung zerstört und die darin gespeicherten Variablen und Funktionen werden ebenfalls zerstört. Wenn es sich um eine globale Umgebung handelt, müssen alle Programme ausgeführt werden oder die Webseite wird zerstört.
Entfernen Sie die lokalen VAR -VARIABLE
<script type = "text/javaScript"> var name = "Jack"; Funktion setName () {name = "trigkit4"; // var entfernen und eine globale Variable werden} setName (); alert (name); // pop -up trigkit4 </script>Durch die Übergabe von Parametern ist es auch eine lokale Variable
<script type = "text/javaScript"> var name = "Jack"; FunktionsetName (Name) {// Argumente übergeben ist auch der lokale Variable -Alarm (Name); } setName ("trigkit4"); // Pop -up Trigkit4 Alert (Name); // Popup Jack </script>Die Funktion enthält auch Funktionen, und nur diese Funktion kann auf die innere Funktionsebene zugreifen.
<script type = "text/javaScript"> var name = "Jack"; Funktion setName () {function setyear () {// Der Umfang der Setyear () -Methode befindet sich innerhalb setName () return 21; }} alert (setyear ()); // Zugriff auf einen Fehler </script>Sie können darauf zugreifen von:
<script type = "text/javaScript"> var name = "Jack"; Funktion setName () {function setyear () {// Der Umfang der Setyear () -Methode befindet sich innerhalb setName () return 21; } return setyear (); } alert (setName ()); // Pop 21 </script>Ein weiteres Beispiel für den Umfang:
<script type = "text/javaScript"> var name = "Jack"; Funktion setName () {function setyear () {// Der Umfang der Setyear () -Methode befindet sich in setName () var b = "hi"; // Der Umfang der Variablen B befindet sich in setyear () return 21; } alert (b); // das unzugängliche} </script>Wenn der Code in einer Umgebung ausgeführt wird, wird eine Umgebungskette gebildet. Ziel ist es, den geordneten Zugriff auf Variablen und Funktionen mit Zugriffsrechten in der Ausführungsumgebung zu gewährleisten (in Bezug auf den Zugriff nach der Regelebene). Das vordere Ende der Bereichskette ist das variable Objekt der Ausführungsumgebung.
Umfang
Wenn eine Variable in einer Funktion nicht deklariert oder deklariert wird, ist sie eine globale Variable und hat einen globalen Bereich. Alle Eigenschaften eines Fensterobjekts haben einen globalen Bereich. Es kann überall im Code zugegriffen werden, und mit var deklarierter Variablen sind lokale Variablen, die nur in der Funktionsbehörde verwendet werden können. Obwohl die Funktionsparameter Var nicht verwenden, sind sie immer noch lokale Variablen.
Kein Umfang auf Blockebene
Kein Umfang auf Blockebene
// Anweisung: <script type = "text/javaScript"> if (true) {// Die lockigen Klammern der IF -Anweisung haben keine Umfangfunktion. var box = "trigkit4";} alert (box); // popt up trigkit4 </script>Gleiches gilt für Schleifenanweisungen.
Variablenabfrage
In variabler Abfrage ist der Zugriff auf lokale Variablen schneller als globale Variablen, sodass die Umfangskette nicht durchsucht werden muss.
Wie im folgenden Beispiel gezeigt:
<script type = "text/javaScript"> var name = "Jack"; Funktion setName () {var name = "trigkit4"; Rückgabename; // Suchen Sie nach Variablen von der unteren Ebene up} alert (setName ()); </script>Speicherprobleme
JavaScript verfügt über einen automatischen Mülleimermechanismus. Sobald die Daten nicht mehr verwendet werden, kann sie auf "Null" eingestellt werden, um die Referenz freizusetzen
Recycelnreferenz
Ein sehr einfaches Beispiel: Ein DOM -Objekt wird von einem JavaScript -Objekt verwiesen und bezieht sich gleichzeitig auf dasselbe oder andere JavaScript -Objekt. Dieses DOM -Objekt kann ein Speicherleck verursachen. Verweise auf dieses DOM -Objekt werden vom Müllsammler nicht recycelt, wenn das Skript gestoppt wird. Um eine kreisförmige Referenz zu brechen, muss das Objekt, das sich auf das DOM -Element oder den Verweis auf das DOM -Objekt bezieht, einen Wert von NULL zugewiesen werden.
Schließung
Bei der Einführung von Variablen außerhalb des Verschlusses in den Verschluss kann dieses Objekt beim Ende des Verschlusses nicht Müll gesammelt (GC) sein.
var a = function () {var frearstr = new Array (1000000) .Join ('x'); return function () {return lvestr; }} ();Dom -Leck
Wenn der ursprüngliche COM entfernt wird, kann die Sub-Node-Referenz nicht recycelt werden, wenn sie nicht entfernt wird.
var select = document.querySelector; var treeref = select ('#baum'); // Im COM -Baum ist Leafref ein untergeordneter Knoten von Baumfre var leafref = select ('#leaf'); var body = select ('body'); body.removechild (treeref); // #Baum kann nicht recycelt werden, da TREEREF immer noch da ist // Lösung: treeref = null; // Baum kann nicht recycelt werden, weil Leafref immer noch da ist, Leafref = Null; // Jetzt kann #Tree freigesetzt werden.Timers Messung (Bestimmung) Timer -Leck
Timer sind auch häufige Orte, an denen Speicherlecks auftreten:
für (var i = 0; i <90000; i ++) {var buggyObject = {Callagain: function () {var ref = this; var val = setTimeout (function () {ref.callagain ();}, 90000); }} buggyObject.callagain (); // Obwohl Sie recyceln möchten, ist der Timer immer noch fehlerhaft = null;}Debugging Memory
Das Debugging -Tool von Chromes eigenem Speicher kann die Speicherverwendung und Speicherlecks problemlos anzeigen:
Klicken Sie in Timeline -> Speicher: Speicher: Speicher: