Maison  >  Article  >  interface Web  >  Comprendre la portée des variables et les problèmes de mémoire en JavaScript

Comprendre la portée des variables et les problèmes de mémoire en JavaScript

php是最好的语言
php是最好的语言original
2018-08-03 10:17:571137parcourir

Problèmes de portée variable et de mémoire

1. Valeurs des types de base et des types de référence

Les types de base sont des segments de données simples (5 types de valeur), tandis que les types de référence sont des objets (référence à l'objet manipulé).

1.1 Copie des valeurs des variables

Les types de référence transmettent en fait le pointeur de fonction lors de la copie, une fois la copie terminée, les deux variables font en fait référence au même objet de mémoire tas, si vous modifiez cet objet. les valeurs des deux variables changeront également de manière synchrone.

1.2 Passage des paramètres

Les paramètres de la fonction sont tous passés par valeur . En fait, je pense que cette affirmation est encore quelque peu abstraite. Il vaut mieux résumer ainsi. Lorsque la variable transmise à la fonction est un type valeur, alors la valeur de la variable d'origine transmise à la fonction ne changera pas avec l'influence à l'intérieur de la fonction. Lorsque la variable passée à la fonction est un type référence (objet), alors la référence de la variable d'origine passée à la fonction ne changera pas avec l'influence à l'intérieur de la fonction. En fait, ce n'est pas facile à comprendre ici. Par exemple, donnez un exemple pour illustrer

        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}

Dans l'exemple ci-dessus, l'adresse mémoire de val dans la fonction a changé (la référence a changé). Si la fonction est passée par référence, alors la référence de val est la référence de obj. Si l'application de val change, la référence de obj changera également, donc le résultat de obj devrait également être {name:'zakas',age. :40}. S'il est passé par valeur, obj est affecté à sa référence à val, mais leurs références ne sont pas associées ensemble. Les modifications apportées à la référence val n'affecteront pas l'adresse de référence d'obj.

Les paramètres formels d'une fonction sont des variables locales dans la portée de la fonction. Il sera détruit une fois l’exécution de la fonction terminée.

1.3 Type de détection

instanceof peut effectuer une détection plus explicite des types de référence. Par conséquent, le type valeur dans instanceof est toujours faux et il n’est pas nécessaire d’utiliser sa méthode pour détecter le type valeur. instanceof ne peut faire la distinction qu'entre Array Object et RegExp

2 Environnement d'exécution

Chaque environnement d'exécution a un objet variable. Il s'agit d'une grande collection de toutes les variables définies dans la portée ; chaque environnement d'exécution a un objet variable , qui stocke toutes les variables que nous définissons, mais nous ne pouvons pas accéder à cet objet variable, mais il peut être analysé. utilisé en arrière-plan lorsque le serveur traite les données.

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

La chaîne de portée de B() contient 3 objets, l'un est son propre objet variable, ainsi que l'objet variable de A et l'objet variable globale. La chaîne de portée dans A() contient 2 objets, le propre objet variable de A() et l'objet variable globale. Par conséquent, A ne peut pas accéder aux variables de B, mais ne peut accéder qu’à ses propres variables globales. Mais B peut non seulement accéder à ses propres variables, mais également accéder aux variables de A et à la portée globale.

2.1 Étendre la chaîne de portée

avec

Avec équivaut à créer un nouvel objet variable au-dessus de la portée actuelle. Par exemple :

    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()

La méthode With entraînera une perte importante de performances, il n'est donc généralement pas recommandé d'utiliser

2.2 Aucune portée au niveau du bloc

Vous devez savoir ce concept et fonction et différence, la question la plus courante :

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

Sous prémisse de comprendre ce problème, vous devez d'abord savoir que le timer est asynchrone, même s'il est à 0, il doit être placé dans la zone tampon en premier, et quand autre Le programme est appelé une fois l'exécution descendante terminée. Ainsi, une fois que les autres programmes sont exécutés de haut en bas, puisqu'il n'y a pas de portée au niveau du bloc, i est global et est devenu 10, donc 10 10 sont générés. Si je suis modifié pour laisser avec une portée au niveau du bloc, le problème sera résolu.

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

2.3 Garbage Collection

JavaScript dispose d'un mécanisme automatique de garbage collection

Le processus d'utilisation des valeurs est en fait équivalent à La mémoire allouée par la variable est écrite et lue . JavaScript alloue de la mémoire lors du processus de création des variables et libère automatiquement les variables lorsqu'elles ne sont pas utilisées. Ce processus est appelé mécanisme de récupération de place, mais cette automatique est donc source de confusion. De nombreux développeurs estiment donc qu'ils n'ont pas besoin de s'en soucier. trop sur les problèmes de mémoire, ce qui est faux.

Principe : Le processeur de déchets détectera périodiquement par défaut, découvrira ces variables inutilisées, puis libérera sa mémoire.
Stratégie de recyclage : Dans l'environnement local, une fois la fonction appelée, le garbage collector suivra quelles variables sont utiles et quelles variables sont inutiles, marquez-les pour préparer le recyclage de leur mémoire. . , mais la méthode des balises a généralement deux autres stratégies :

  • Effacement des balises : depuis 2012, tous les navigateurs utilisent la méthode de compensation des balises pour la collecte des déchets, et tous les déchets js L'amélioration du recyclage est également basé sur l'optimisation de l'algorithme de la méthode mark et clear.

  • Comptage de références : Ceci n'est pratiquement plus utilisé en raison de graves problèmes de référence circulaire.

Par conséquent, lors de l'écriture d'un programme occupant moins de mémoire, c'est un point très important pour des pages performantes. Ainsi, lorsque nous écrivons un programme, une fois que les données ne sont plus nécessaires, il est préférable de le mettre à null pour déréférencement

Articles associés :

JavaScript portée variable et mémoire Question (2)

Tutoriel vidéo Javascript de Li Yanhui

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn