L'environnement d'exécution définit d'autres données que les variables ou les fonctions ont la permission d'accès et détermine leur comportement respectif. Chaque environnement d'exécution a un objet variable qui lui est associé.
L'environnement d'exécution mondiale est l'environnement d'exécution le plus périphérique. Selon l'environnement hôte dans lequel se trouve l'implémentation JavaScript, les objets représentant l'environnement d'exécution sont également différents. Dans un navigateur Web, l'environnement d'exécution globale est considéré comme un objet de fenêtre. Par conséquent, toutes les variables et fonctions globales sont créées en tant que propriétés et méthodes des objets de fenêtre.
Objet variable: toutes les variables et fonctions définies dans l'environnement sont stockées dans cet objet.
Chaîne de portée: lorsque le code est exécuté dans un environnement, une chaîne de portée d'objets variables est créée. Le but de la chaîne de portée est d'assurer l'accès ordonné à toutes les variables et fonctions qui ont la permission d'accéder à l'environnement d'exécution. L'extrémité avant de la chaîne de portée est toujours un objet variable dans l'environnement où se trouve le code actuellement exécuté.
Objet actif: l'objet actif ne contient qu'une seule variable au début, c'est-à-dire l'objet d'arguments. L'objet variable suivant dans la chaîne de portée provient de l'environnement d'inclusion (externe), et l'objet variable suivant provient de l'environnement d'inclusion suivant. Cela continue vers l'environnement d'exécution mondiale; Les objets variables de l'environnement d'exécution global sont toujours le dernier objet de la chaîne de portée.
Analyse d'identifiant: l'analyse d'identifiant est un processus de recherche d'identifiants un par un le long de la chaîne de portée. Le processus de recherche commence toujours de l'extrémité avant de la chaîne de portée, puis remonte à l'étape par étape jusqu'à ce que l'identifiant soit trouvé.
Exemple de code:
var color = "blue"; fonction changeColor () {if (color === "bleu") {color = "red"; } else {color = "bleu"; }} changeColor (); alert ("Color est maintenant" + couleur);La chaîne de portée de la fonction ChangeColor () contient deux objets: son propre objet variable (qui définit l'objet d'arguments) et un objet variable des variables globales. La couleur variable est accessible à l'intérieur de la fonction car elle peut être trouvée dans cette chaîne de portée.
De plus, les variables définies dans les lunettes locales peuvent être utilisées de manière interchangeable avec des variables globales dans un environnement local, exemple:
var color = "blue"; fonction changchecolor () {var autre autrecolor = "red"; fonction swapColors () {var tempcolor = un autrecolor; un autrecolor = couleur; color = tempcolor; // Vous pouvez accéder à la couleur, un autrecolor et un tempcolor ici} // Vous pouvez accéder à la couleur et un autreColor ici, mais vous ne pouvez pas accéder à Tempcolor SwapColors ();} // vous ne pouvez accéder qu'à ColorChangeColor ();Le code ci-dessus implique 3 environnements d'exécution: l'environnement global, l'environnement de poignée de ChangeColor () et l'environnement local de SwapColors ().
Il existe une couleur variable et une fonction ChangeColor () dans la variable globale. La variable locale de ChangeColor () contient une variable un autreColor et une fonction SwapColors () de fonction, qui peut accéder à la couleur dans la variable globale. Il existe un tempcolore variable dans la variable locale de SwapColors (). Dans SwapColors (), vous pouvez accéder à la couleur de la variable globale, ou dans une autre variable Color, car ces deux environnements sont son environnement d'exécution parent. La chaîne de portée de l'exemple ci-dessus est:
Parmi eux, l'environnement interne peut accéder à tous les environnements externes via la chaîne de portée, mais l'environnement externe ne peut accéder à aucune variable et fonction dans l'environnement interne . Les connexions entre les variables d'environnement sont linéaires et séquentielles. Chaque variable ne peut rechercher que la chaîne de portée de la supérieure pour interroger la variable et le nom de la fonction, c'est-à-dire en interrogeant d'abord la variable ou le nom de la fonction de cette fonction, et si elle n'est pas interrogé dans la chaîne de portée précédente jusqu'à la portée supérieure. Cependant, aucun environnement ne peut rechercher la chaîne de portée et entrer un autre environnement d'exécution.
Les paramètres de fonction sont également traités comme des variables, donc leurs règles d'accès sont les mêmes que les autres variables dans l'environnement d'exécution.
1. Étendre la chaîne de portée
La chaîne de portée est étendue lorsque le flux d'exécution entre dans l'une des déclarations suivantes:
• Catch Block of Try-Patch Instruction
• Avec déclaration
Ces deux instructions ajouteront un objet variable à l'extrémité avant de la portée.
Pour l'instruction avec, la variable spécifiée est ajoutée à la chaîne de portée. Pour l'instruction Catch, un nouvel objet variable est créé, qui contient la déclaration du mauvais objet lancé.
Par exemple:
fonction buildUrl () {var qs = "? debug = true"; avec (emplacement) {var url = href + qs; } RETOUR URL;}L'instruction avec reçoit un objet de localisation, donc son objet variable contient les propriétés et les méthodes utilisées par l'objet de localisation, et cet objet variable est ajouté à l'extrémité avant de la chaîne de portée. Lorsque vous faites référence à la variable HREF dans l'instruction avec (se référant réellement à Location.href), il peut être trouvé dans la variable d'environnement actuelle. Lorsque vous faites référence à la variable QS, la variable définie dans buildUrl () est référencée, qui est située dans l'objet variable de l'environnement de fonction. En ce qui concerne l'instruction avec une variable nommée URL est définie, l'URL fait donc partie de l'environnement d'exécution de la fonction et peut être renvoyée comme valeur de la fonction.
2. Pas de portée au niveau du bloc
En JavaScript, les accolades bouclées fermées n'ont pas leur propre portée. Regardez le code suivant:
if (true) {var color = "bleu";} alert (couleur); // "bleu"Dans JavaScript, la déclaration de variable créée par l'instruction if / FOR ajoute la variable à l'environnement d'exécution actuel. Par exemple:
pour (var i = 0; i <10; i ++) {dosomething (i);} alert (i); // 10Recyclage des ordures
Semblable à Java, JavaScript a également un mécanisme de recyclage automatique des ordures. L'environnement d'exécution est responsable de la gestion de la mémoire utilisée pendant l'exécution du code. Lors de la rédaction de programmes, il n'est pas nécessaire de problèmes d'utilisation de la mémoire connexes. L'allocation de la mémoire requise et le recyclage de la mémoire inutile sont pleinement implémentées. Le principe du mécanisme de collecte des ordures est: trouver des variables qui ne sont plus utilisées, puis libérer la mémoire qu'il occupe. Pour ce faire, le collecteur des ordures effectuera périodiquement cette opération à un intervalle de temps fixe (ou un temps de collecte prédéterminé pendant l'exécution du code).
Avant de faire la collecte des ordures, vous devez déterminer si la ressource est inutile et les variables de marque qui ne sont plus utilisées pour recycler leur mémoire à l'avenir. Il existe généralement deux implémentations de stratégies pour identifier les variables inutiles.
1 marque claire
La façon la plus courante de collecte des ordures en JavaScript est le nettoyage des marqueurs. Lorsqu'une variable entre dans l'environnement, elle est marquée comme «entrez dans l'environnement»; Lorsqu'une variable quitte l'environnement, elle est marquée comme "quitter l'environnement". Lorsque le collecteur des ordures fonctionne, il marque toutes les variables utilisées. Il supprime ensuite les étiquettes des variables dans l'environnement et les variables référencées par des variables dans l'environnement. Après cela, les variables marquées seront considérées comme des variables prêtes à être supprimées. Enfin, le collecteur des ordures termine le travail de compensation de la mémoire, détruit les valeurs marquées et recycle l'espace mémoire qu'ils occupent.
2. Compte de référence
Le nombre de références fait référence au nombre de fois que chaque valeur est référencée. Lorsqu'une variable est déclarée et qu'une valeur de type de référence est attribuée à la variable, le nombre de références à cette valeur est 1. Si la même valeur est attribuée à une autre variable, le nombre de références à la valeur est augmenté de 1. Inversement, si la variable contenant la référence à cette valeur prend une autre variable, le nombre de références à cette valeur est réduite. Son espace mémoire peut être récupéré. La prochaine fois que le collecteur des ordures fonctionnera, il recycle la mémoire occupée par ces valeurs avec des références nulles.
Un problème que le comptage de référence peut provoquer des références recyclées. Par exemple:
Fonction Problem () {var obja = new object (); var objb = nouveau objet (); obja.someotheroBj = objb; objb.someotherobj = obja;}Dans l'exemple ci-dessus, obja et objb se référent les uns aux autres via des attributs. Une fois l'exécution de la fonction terminée, OBJA et OBJB continueront d'exister et leur nombre de références ne sera pas 0. Cette situation entraînera le recyclage de la mémoire occupée par l'OBJA et l'OBJB.
L'article ci-dessus parle brièvement de JavaScript: Environment, Exécution, Scope et Collection Garbage sont tout le contenu que je partage avec vous. J'espère que vous pourrez vous faire référence et j'espère que vous pourrez soutenir Wulin.com plus.