Maison > Article > interface Web > Comprendre la portée des variables et les problèmes de mémoire en JavaScript
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é).
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.
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.
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
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.
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
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) }
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!