Heim  >  Artikel  >  Web-Frontend  >  Verständnis von Variablenumfangs- und Speicherproblemen in JavaScript

Verständnis von Variablenumfangs- und Speicherproblemen in JavaScript

php是最好的语言
php是最好的语言Original
2018-08-03 10:17:571153Durchsuche

Variablenumfang und Speicherprobleme

1. Werte von Basistypen und Referenztypen

Basistypen sind einfache Datensegmente (5 Werttypen), während Referenztypen Objekte sind (Referenz). zum manipulierten Objekt).

1.1 Variablenwerte kopieren

Referenztypen übergeben beim Kopieren tatsächlich den Funktionszeiger. Wenn Sie dieses Objekt ändern, verweisen die beiden Variablen tatsächlich auf denselben Heapspeicher. Auch die Werte der beiden Variablen ändern sich synchron.

1.2 Übergabe von Parametern

Die Parameter der Funktion werden alle als Wert übergeben . Tatsächlich halte ich diese Aussage noch für etwas abstrakt. Es ist besser, es so zusammenzufassen. Wenn die an die Funktion übergebene Variable ein Werttyp ist, ändert sich der -Wert der ursprünglichen, an die Funktion übergebenen Variablen nicht durch den Einfluss innerhalb der Funktion. Wenn die an die Funktion übergebene Variable ein Referenztyp (Objekt) ist, ändert sich die -Referenz der ursprünglichen, an die Funktion übergebenen Variablen nicht durch den Einfluss innerhalb der Funktion. Tatsächlich ist es hier nicht leicht zu verstehen. Geben Sie zum Beispiel ein Beispiel zur Veranschaulichung:

        var obj = {
            name: 'andy'
        }

        function ChangeObj(val) {
            val.age = '25'
            val = {
                name:'zakas',
                age:40
            }
            return val;
        }
        ChangeObj(obj); // {name:'zakas',age:40}
        console.log(obj) // {name:'andy',age:25}

Im obigen Beispiel hat sich die Speicheradresse von val in der Funktion geändert Funktion wird als Referenz übergeben, dann val Die Referenz ist die Referenz von obj. Wenn sich die Anwendung von val ändert, ändert sich auch die Referenz von obj, daher sollte das Ergebnis von obj auch {name:'zakas',age:40} sein. . Wenn es als Wert übergeben wird, wird obj seiner Referenz auf val zugewiesen, aber ihre Referenzen werden nicht miteinander verknüpft. Änderungen an der val-Referenz haben keinen Einfluss auf die Referenzadresse von obj.

Die formalen Parameter einer Funktion sind lokale Variablen im Funktionsumfang. Es wird zerstört, wenn die Ausführung der Funktion beendet ist.

1.3 Erkennungstyp

instanceof kann eine explizitere Erkennung von Referenztypen durchführen. Daher ist der Werttyp in der Instanz von immer falsch und es besteht keine Notwendigkeit, die entsprechende Methode zum Erkennen des Werttyps zu verwenden. Instanz von kann nur zwischen Array-Objekt und RegExp unterscheiden

2. Ausführungsumgebung

Jede Ausführungsumgebung verfügt über ein Variablenobjekt. Es handelt sich um eine große Sammlung aller im Bereich definierten Variablen. Jede Ausführungsumgebung verfügt über ein Variablenobjekt , das alle von uns definierten Variablen speichert. Wir können jedoch nicht auf dieses Variablenobjekt zugreifen, es kann jedoch analysiert werden Wird im Hintergrund verwendet, wenn der Server Daten verarbeitet.

    function A() {
        var tempA;
        function B() {
            var tempB;
            function C() {
                var tempC
            }
        }
    }

Die Bereichskette von B() enthält 3 Objekte, eines ist sein eigenes Variablenobjekt sowie das Variablenobjekt von A und das globale Variablenobjekt. Die Bereichskette in A() enthält zwei Objekte, das eigene Variablenobjekt von A() und das globale Variablenobjekt. Daher kann A nicht auf die Variablen von B zugreifen, sondern nur auf seine eigenen und globalen Variablen. Aber B kann nicht nur auf seine eigenen Variablen zugreifen, sondern auch auf die Variablen in A und den globalen Bereich.

2.1 Erweitern Sie die Bereichskette

mit

Mit entspricht dem Erstellen eines neuen Variablenobjekts über dem aktuellen Bereich. Zum Beispiel:

    var obj = {
        name:'andy',
        sex:'man',
        hobby:'game'
    }
    function fn() {
        with(obj) {
            fnName = name;
            fnSex = sex;
            fnHobby = hobby;
        }
        console.log(fnName,fnSex,fnHobby) // andy,man,game
    }
    fn()

With-Methode führt zu ernsthaften Leistungseinbußen, daher wird die Verwendung im Allgemeinen nicht empfohlen

2.2 Kein Bereich auf Blockebene

Sie müssen dieses Konzept kennen , Funktion und Unterschied, die häufigste Frage:

for(var i =0 ; i < 10 ; i++ ) {
    setTimeout(function(){
        console.log(i);
    },0)
}

Um dieses Problem zu verstehen, müssen Sie zunächst wissen, dass der Timer asynchron ist. Auch wenn er 0 ist, muss er zuerst im Cache-Bereich platziert werden . Wenn andere Programme von oben starten, rufen Sie es erneut auf, nachdem die Ausführung abgeschlossen ist. Nachdem also andere Programme von oben nach unten ausgeführt wurden, ist i global und wird zu 10, da es keinen Bereich auf Blockebene gibt, sodass 10 10 ausgegeben werden. Wenn i auf „let“ mit Blockebenenbereich geändert wird, wird das Problem gelöst.

for(let i =0 ; i < 10 ; i++ ) {
    setTimeout(function(){
        console.log(i);
    },0)
}

2.3 Garbage Collection

JavaScript verfügt über einen automatischen Garbage-Collection-Mechanismus

Der Prozess der Verwendung von Werten entspricht tatsächlich dem Zuweisen Variablen Führen Sie Schreib- und Lesevorgänge im Speicher aus. JavaScript weist beim Erstellen von Variablen Speicher zu und gibt die Variablen automatisch frei, wenn sie nicht verwendet werden. Dieser Vorgang wird jedoch als Garbage-Collection-Mechanismus bezeichnet. Viele Entwickler sind jedoch der Meinung, dass sie sich nicht darum kümmern müssen zu viel über Speicherprobleme, was falsch ist.

Prinzip: Der Müllprozessor erkennt standardmäßig regelmäßig die nicht verwendeten Variablen, findet sie heraus und gibt dann seinen Speicher frei.
Recycling-Strategie: In der lokalen Umgebung verfolgt der Garbage Collector nach dem Aufruf der Funktion, welche Variablen nützlich und welche nutzlos sind, um sie für die Wiederverwertung ihres Speichers vorzubereiten . , aber die Tag-Methode hat normalerweise zwei andere Strategien:

  • Tag-Clearing: Seit 2012 verwenden alle Browser die Tag-Clearing-Methode für die Speicherbereinigung und alle js-Müll Die Verbesserung des Recyclings ist basiert auch auf der Algorithmusoptimierung der Mark- und Clear-Methode.

  • Referenzzählung: Dies wird aufgrund schwerwiegender Zirkelverweisprobleme grundsätzlich nicht mehr verwendet.

Daher ist es für Hochleistungsseiten ein sehr wichtiger Punkt, beim Schreiben eines Programms weniger Speicher zu belegen. Wenn wir also ein Programm schreiben und die Daten nicht mehr benötigt werden, ist es am besten, sie auf Null zu setzen, um sie zu dereferenzieren

Verwandte Artikel:

JavaScript Variabler Umfang und Speicher Frage (2)

Li Yanhui Javascript-Video-Tutorial

Das obige ist der detaillierte Inhalt vonVerständnis von Variablenumfangs- und Speicherproblemen in JavaScript. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn