Heim  >  Artikel  >  Web-Frontend  >  Detaillierte Erläuterung von Beispielen für JavaScript-Variablenbereiche, Speicher, DOM-Lecks und andere Probleme

Detaillierte Erläuterung von Beispielen für JavaScript-Variablenbereiche, Speicher, DOM-Lecks und andere Probleme

伊谢尔伦
伊谢尔伦Original
2017-07-18 10:31:521462Durchsuche

Geltungsbereich

Die Variable wird nicht innerhalb der Funktion deklariert oder ohne Variable deklariert, sie ist eine globale Variable und hat einen globalen Gültigkeitsbereich. Alle Eigenschaften des Fensterobjekts haben einen globalen Gültigkeitsbereich ; in Auf den Code kann überall zugegriffen werden, wenn er innerhalb einer Funktion deklariert und mit var geändert wird. Obwohl die Parameter der Funktion keine var verwenden, sind sie dennoch lokale Variablen.

Kein Gültigkeitsbereich auf Blockebene


// if语句:

<script type="text/javascript">
if(true){            //if语句的花括号没有作用域的功能。

var box = "trigkit4";
}
alert(box);//弹出 trigkit4
</script>

Das Gleiche gilt für die for-Schleifenanweisung.

Variablenabfrage

Bei der Variablenabfrage ist der Zugriff auf lokale Variablen schneller als auf globale Variablen, sodass keine Suche in der Bereichskette erforderlich ist.
Das folgende Beispiel:


<script type="text/javascript">
   var name = "Jack";
   function setName(){
      var name = "trigkit4";
      return name; //从底层向上搜索变量
  }
  alert(setName());   
</script>

Speicherproblem

Javascript verfügt über einen automatischen Garbage-Collection-Mechanismus, sobald die Daten gespeichert sind nicht mehr verwendet wird, können Sie es auf „null“ setzen, um die Referenz freizugeben

Zirkelreferenz

Ein sehr einfaches Beispiel: Ein DOM-Objekt wird von einem Javascript referenziert Objekt, und wenn gleichzeitig erneut auf dasselbe oder ein anderes Javascript-Objekt verwiesen wird, kann dieses DOM-Objekt einen Speicherverlust verursachen. Der Verweis auf dieses DOM-Objekt wird vom Garbage Collector nicht zurückgefordert, wenn das Skript beendet wird. Um einen Referenzzyklus zu unterbrechen, muss dem Objekt, das auf das DOM-Element verweist, oder einem Verweis auf das DOM-Objekt null zugewiesen werden.

Abschluss

Wenn eine Variable außerhalb des Abschlusses in den Abschluss eingeführt wird, kann das Objekt am Ende des Abschlusses nicht durch Garbage Collection (GC) gesammelt werden.


var a = function() {
 var largeStr = new Array(1000000).join(&#39;x&#39;);
 return function() {
  return largeStr;
 }
}();

DOM-Leck

Wenn die ursprüngliche COM entfernt wird, wird die Referenz auf den untergeordneten Knoten nicht entfernt. Sie kann nicht recycelt werden .


var select = document.querySelector;
var treeRef = select(&#39;#tree&#39;);
//在COM树中leafRef是treeFre的一个子结点
var leafRef = select(&#39;#leaf&#39;); 
var body = select(&#39;body&#39;);
body.removeChild(treeRef);
//#tree不能被回收入,因为treeRef还在
//解决方法:
treeRef = null;
//tree还不能被回收,因为叶子结果leafRef还在
leafRef = null;
//现在#tree可以被释放了。

Timer-Timer-Lecks

Timer sind auch ein häufiger Ort, an dem Speicherlecks auftreten:


for (var i = 0; i < 90000; i++) {
 var buggyObject = {
  callAgain: function() {
   var ref = this;
   var val = setTimeout(function() {
    ref.callAgain();
   }, 90000);
  }
 }
 buggyObject.callAgain();
 //虽然你想回收但是timer还在
 buggyObject = null;
}

Speicher debuggen

Das integrierte Speicher-Debugging-Tool von Chrome kann die Speichernutzung und Speicherlecks einfach anzeigen:
Klicken Sie auf „Aufzeichnen in der Zeitleiste“ – > Speicher:

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung von Beispielen für JavaScript-Variablenbereiche, Speicher, DOM-Lecks und andere Probleme. 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