JavaScript comprend des concepts tels que la portée (portée), la chaîne de portée (chaîne de portée), le contexte d'exécution (contexte d'exécution), l'objet actif (objet actif), la portée dynamique (portée dynamique) et la fermeture (fermeture). Pour comprendre ces concepts, nous les analysons à des aspects statiques et dynamiques.
Tout d'abord, écrivons une fonction simple pour faire un exemple:
La copie de code est la suivante:
fonction add (num1, num2) {
var sum = num1 + num2;
somme de retour;
}
Nous définissons une fonction ADD avec deux paramètres formels.
Aspects statiques:
Lors de la création d'une fonction ADD, le moteur JavaScript créera une chaîne de portée de la fonction ADD, et cette chaîne de portée pointe vers le contexte global. Si vous utilisez des représentations graphiques, la figure suivante est montrée:
Comme on peut le voir sur la figure ci-dessus, lorsque la fonction ADD est créée, la chaîne de portée a été créée, afin que nous puissions tirer une conclusion que la chaîne de portée de la fonction est créée lorsque la fonction est créée, plutôt qu'une période d'exécution dynamique. Jetons un coup d'œil à ce qui se passe pendant la course dynamique.
Aspects dynamiques:
Lors de l'exécution de la fonction ADD, JavaScript créera un contexte d'exécution, qui contient toutes les informations requises pendant l'exécution de la fonction ADD. Exécuter le contexte a également sa propre chaîne de portée. Lorsque la fonction est en cours d'exécution, le moteur JavaScript initialise d'abord la chaîne de portée du contexte d'exécution à partir de la chaîne de portée de la fonction ADD, puis le moteur JavaScript créera un objet actif, qui contient toutes les variables locales, les paramètres et cette variable et d'autres variables pendant l'exécution de la fonction.
Si l'image est décrite, ce qui se passe pendant l'exécution dynamique de la fonction ADD, elle peut être décrite dans la figure suivante:
Comme le montre la figure ci-dessus, le contexte d'exécution est un concept dynamique. Il est créé lorsque la fonction est en cours d'exécution. En même temps, l'objet actif est également un concept dynamique. Il est référencé par la chaîne de portée du contexte d'exécution. Par conséquent, on peut conclure que le contexte d'exécution et l'objet actif sont des concepts dynamiques, et la chaîne de portée du contexte d'exécution est initialisée par la chaîne de portée de la fonction.
Ce qui précède parle de la portée de la portée de la fonction et du contexte d'exécution. Parlons du problème de la portée dynamique. Lorsque JavaScript passe avec avec des instructions, les clauses de capture d'essai et les méthodes d'évaluation, le moteur JavaScript modifiera dynamiquement la portée du contexte d'exécution. Jetons un œil à cela avec un exemple:
La copie de code est la suivante:
fonction initUi () {
avec (document) {// éviter!
var bd = corps,
links = getElementsByTagName ("a"),
i = 0,
len = links.length;
tandis que (i <len) {
Mise à jour (liens [i ++]);
}
getElementById ("go-btn"). onClick = function () {
commencer();
};
bd.classname = "actif";
}
Lors de l'exécution de la fonction Initii ci-dessus, JavaScript créera dynamiquement une portée correspondante correspondant à l'instruction avec et la placera à l'extrémité avant de la chaîne de portée du contexte d'exécution. Le processus ci-dessus peut être décrit de manière vivante à travers la figure ci-dessous. La zone marquée rouge ci-dessous montre la portée générée par la déclaration avec.
Enfin, jetons un coup d'œil à la fermeture la plus mystérieuse de JavaScript. Les fermetures sont en fait une fonction en JavaScript. La fermeture est créée pendant l'exécution de la fonction. Prenons un exemple pour voir:
La copie de code est la suivante:
function AssignEvents () {
var id = "xdi9592";
document.getElementById ("Save-Btn"). OnClick = fonction (événement) {
Savedocument (id);
};
}
Lorsque la fonction AssignEvents ci-dessus est exécutée, une fermeture sera créée et cette fermeture se référera à la variable d'ID dans la portée de AssignEvents. Si, selon le langage de programmation traditionnel, ID est une variable stockée sur la pile. Lorsque la fonction est exécutée, l'ID disparaît, alors comment peut-il être référencé? De toute évidence, JavaScript adopte une autre façon ici. Voyons comment JavaScript met en œuvre la fermeture. Lors de l'exécution de la fonction AssignEvents, le moteur JavaScript créera une chaîne de portée du contexte d'exécution de la fonction AssignEvents. Cette chaîne de portée contient les objets actifs lors de l'exécution de l'AssignEvents. Dans le même temps, le moteur JavaScript créera également une fermeture, et la chaîne de portée de la fermeture fera également référence aux objets actifs lors de l'exécution des AssignEvents. De cette façon, lorsque les Assemblés sont exécutés, bien que la chaîne de portée de son propre contexte d'exécution ne se réfère plus aux objets actifs, la fermeture fait toujours référence aux objets actifs correspondant à l'exécution de l'AssistEvents, ce qui explique le mécanisme de fermeture à l'intérieur de JavaScript. Vous pouvez utiliser la figure suivante pour décrire la situation de la fonction AssignEvents ci-dessus: l'exécution de la fonction:
Comme on peut le voir à partir de ce qui précède, après l'exécution de la fonction AssignEvents, document.getElementById ("Save-Btn"). OnClick fait référence à la fermeture. De cette façon, lorsque l'utilisateur clique sur Save-BTN, l'exécution de la fermeture sera déclenchée. Jetons un coup d'œil à la situation lorsque la fermeture est exécutée. Comme mentionné précédemment, les fermetures en JavaScript sont en fait des fonctions, donc les situations d'exécution de la fermeture et de l'exécution des fonctions sont cohérentes. Le chiffre suivant décrira très bien la fermeture associée à l'événement onclick ci-dessus.
D'après la figure ci-dessus, nous pouvons voir que le moteur JavaScript crée d'abord le contexte d'exécution de la fermeture, puis utilise la chaîne de portée de fermeture pour initialiser la chaîne de portée du contexte d'exécution de la fermeture et met finalement l'objet actif correspondant lorsque la fermeture est exécutée à l'extrémité avant de la portée, ce qui vérifie davantage que la fermeture est une fonction.