Les valeurs de type de base sont: Undefined, Null, Boolean, Number and String. Ces types occupent un espace de taille fixe en mémoire, et leurs valeurs sont enregistrées dans l'espace de pile, auxquelles nous accéderons par valeur.
(1) Types de valeur: numérique, booléen, nul, indéfini.
(2) Type de référence: objet, tableau, fonction.
Si la valeur attribuée est un type de référence, l'espace doit être alloué pour cette valeur dans la mémoire du tas. Étant donné que la taille de ces valeurs n'est pas fixe (les objets ont de nombreuses propriétés et méthodes), elles ne peuvent pas être enregistrées pour empiler la mémoire. Cependant, la taille de l'adresse de mémoire est fixe, de sorte que l'adresse mémoire peut être enregistrée dans la mémoire de la pile.
<script type = "text / javascript"> var box = new object (); // Créer un type de référence var box = "lee"; // La valeur de type de base est la chaîne Box.age = 23; // Il est bizarre d'ajouter des attributs aux valeurs de type de base, car seuls les objets peuvent ajouter des attributs. alerte (box.age); // Ce n'est pas un type de référence et ne peut pas être sorti; </cript>
En bref, la mémoire du tas stocke les valeurs de référence et la mémoire de pile stocke les valeurs de type fixe.
<script type = "text / javascript"> var man = new object (); // man pointe vers l'adresse spatiale de la mémoire de pile man.name = "jack"; var man2 = man; // man2 obtient l'adresse de l'alerte de pointage de l'homme (man2.name); // les deux pop up alert jack (man.name); </ script>
Copier les valeurs variables
Jetons un coup d'œil à l'exemple suivant:
<script type = "text / javascript"> var man = new object (); // man pointe vers l'adresse spatiale de la mémoire de pile man.name = "jack"; var man2 = man; // man2 obtient l'adresse de l'adresse de pointage de l'homme man2.name = "ming"; // Parce qu'ils pointent tous vers le même objet et le même nom, peu importe qui est modifié, tout le monde a modifié alerte (man2.Name); // à la fois pop-up ming alert (man.name); </ script>
À partir de ce qui précède, nous pouvons voir qu'en termes de copie variable, le type de base et le type de référence sont également différents. Le type de base copie la valeur elle-même, tandis que le type de référence copie l'adresse.
Paramètres de passage
Dans ECMAScript, tous les paramètres des fonctions sont passés par des valeurs.
<script type = "text / javascript"> Box de fonction (num) {// pass num par valeur num + = 10; retour num; } var num = 10; var result = box (num); alerte (résultat); // s'il est passé par référence, le Num dans la fonction deviendra une variable globale, et le nombre à l'extérieur est remplacé par alerte (num); // En d'autres termes, 20 doit être sorti à la fin (10 est sortie ici) </cript>JavaScript n'est pas transmis par référence. S'il y a une référence, les variables de la fonction seront des variables globales et peuvent également accéder à l'extérieur. Mais c'est évidemment impossible.
Environnement d'exécution et portée
L'environnement d'exécution est l'un des concepts les plus importants de JavaScript. L'environnement d'exécution définit les variables ou les fonctions qui ont la permission d'accéder à d'autres données.
L'environnement d'exécution mondiale est l'environnement d'exécution le plus périphérique. Dans un navigateur Web, l'environnement d'exécution globale est un objet de fenêtre. Par conséquent, toutes les fonctions des variables globales sont créées en tant que propriétés et méthodes de fenêtres.
<script type = "text / javascript"> var name = "jack"; // définir la fonction de variable globale setName () {return "Trigkit4"; } alert (window.name); // La variable globale, le plus à l'extérieur, appartient à l'alerte d'attribut de fenêtre (Window.SetName ()); // Fonction globale, la plus à l'extérieur, appartient à la méthode de la fenêtre </cript>Lorsque le code dans l'environnement d'exécution est exécuté, l'environnement est détruit et les variables et fonctions qui y sont enregistrées sont également détruites. S'il s'agit d'un environnement mondial, tous les programmes doivent être exécutés ou la page Web sera détruite.
Supprimer les variables locales de var
<script type = "text / javascript"> var name = "jack"; function setName () {name = "Trigkit4"; // supprime var et devenir une variable globale} setName (); alert (nom); // pop up trigkit4 </cript>En passant par les paramètres, c'est aussi une variable locale
<script type = "text / javascript"> var name = "jack"; fonction setName (name) {// Les arguments de passage sont également la variable locale alert (name); } setName ("trigkit4"); // pop up trigkit4 alert (name); // pop up jack </ script>La fonction contient également des fonctions, et seule cette fonction peut accéder à la couche interne des fonctions.
<script type = "text / javascript"> var name = "jack"; function setName () {fonction seyear () {// La portée de la méthode seyear () est dans setName () return 21; }} alert (seyear ()); // incapable d'accéder, une erreur </cript>Vous pouvez y accéder par:
<script type = "text / javascript"> var name = "jack"; function setName () {fonction seyear () {// La portée de la méthode seyear () est dans setName () return 21; } return seyear (); } alert (setName ()); // pop 21 </cript>Un autre exemple de portée:
<script type = "text / javascript"> var name = "jack"; function setName () {fonction seyear () {// La portée de la méthode seyear () est dans setName () var b = "hi"; // La portée de la variable B est dans Setyear () Retour 21; } alerte (b); // L'inaccessible} </cript>Lorsque le code est exécuté dans un environnement, quelque chose appelé une chaîne de portée sera formé. Son objectif est de garantir l'accès ordonné aux variables et aux fonctions avec les droits d'accès dans l'environnement d'exécution (se référant à l'accès en fonction du niveau de règle). L'extrémité avant de la chaîne de portée est l'objet variable de l'environnement d'exécution.
Portée
Lorsqu'une variable n'est pas déclarée ou déclarée dans une fonction, il s'agit d'une variable globale et il a une portée globale. Toutes les propriétés d'un objet de fenêtre ont une portée globale; Il est accessible n'importe où dans le code, et les variables déclarées en interne et modifiées avec VAR sont des variables locales, qui ne peuvent être utilisées que dans le corps de fonction. Bien que les paramètres de fonction n'utilisent pas VAR, ce sont toujours des variables locales.
Pas de portée au niveau du bloc
Pas de portée au niveau du bloc
// Instruction if: <script type = "text / javascript"> if (true) {// Les accolades bouclées de l'instruction if n'ont pas de fonction de portée. var box = "Trigkit4";} alert (box); // popt up Trigkit4 </script>Il en va de même pour les instructions de boucle.
Requête des variables
Dans la requête variable, l'accès aux variables locales est plus rapide que les variables globales, il n'est donc pas nécessaire de rechercher la chaîne de portée.
Comme indiqué dans l'exemple suivant:
<script type = "text / javascript"> var name = "jack"; function setName () {var name = "Trigkit4"; nom de retour; // Recherchez des variables de la couche inférieure up} alert (setName ()); </cript>Problèmes de mémoire
JavaScript a un mécanisme automatique de collecte des ordures, et une fois que les données ne sont plus utilisées, il peut être défini sur "NULL" pour libérer la référence
Recycler la référence
Un exemple très simple: un objet Dom est référencé par un objet JavaScript et se réfère en même temps à l'objet JavaScript ou autre. Cet objet DOM peut provoquer une fuite de mémoire. Les références à cet objet DOM ne seront pas recyclées par le collecteur des ordures lorsque le script sera arrêté. Pour briser une référence circulaire, l'objet qui fait référence à l'élément DOM ou à la référence à l'objet DOM doit se voir attribuer une valeur de null.
Fermeture
Lors de l'introduction de variables à l'extérieur de la fermeture dans la fermeture, cet objet ne peut pas être collecté à la poubelle (GC) à la fin de la fermeture.
var a = function () {vargestr = nouveau tableau (1000000) .join ('x'); return function () {returngestr; }} ();Fuite de dom
Lorsque le COM d'origine est supprimé, la référence de sous-nœud ne peut pas être recyclée si elle n'est pas supprimée.
var select = document.QuerySelector; var treeref = select ('# arbre'); // Dans l'arborescence com, Leafref est un nœud enfant de Treefre var Leafref = select ('# leaf'); var body = select ('body'); body.removechild (treeref); // # arbre ne peut pas être recyclé parce que Treeref est toujours là // solution: Treeref = null; // L'arbre ne peut pas être recyclé parce que leafref y est toujours leafref = null; // maintenant #Tree peut être libéré.Couppe de minuteries (déterminant) Fuite de la minuterie
Les minuteries sont également des endroits communs où les fuites de mémoire se produisent:
for (var i = 0; i <90000; i ++) {var buggyObject = {callagain: function () {var ref = this; var val = setTimeout (function () {ref.callagain ();}, 90000); }} buggyObject.Callagain (); // Bien que vous souhaitiez recycler, la minuterie est toujours buggyObject = null;}Débogage de la mémoire
L'outil de débogage de la mémoire de Chrome peut facilement afficher l'utilisation de la mémoire et les fuites de mémoire:
Cliquez sur l'enregistrement dans Timeline -> Mémoire: