Premièrement, ce qui suit est trois codes qui expliquent la portée
// =========== Exemple 1 ============= Var Scope = 'Global'; fonction fn () {alert (Scope); var scope = 'local'; alert (scope);} fn (); // Résultat de sortie? alerte (portée); // résultat de sortie? // ============ Exemple 2 =========== Var Scope = 'Global'; fonction fn () {alert (Scope); scope = 'local'; alert (scope);} fn (); // Résultat de sortie? alerte (portée); // résultat de sortie? // ============ Exemple 3 ========== Var Scope = 'Global'; fonction fn (Scope) {alert (Scope); scope = 'local'; alert (scope);} fn (); // Résultat de sortie? alerte (portée); // résultat de sortie?Ces trois codes n'ont qu'une petite différence, mais les résultats sont complètement différents. Exemple 1 Sorties [Undefined, Local, Global], Exemple 2 Sorties [Global, Local, Local], Exemple 3 Sorties [Undefined, Local, Global]. Si vous ne pouvez pas répondre correctement, cela signifie que vous n'avez pas encore compris les caractéristiques de la portée de JavaScript.
Qu'est-ce que la portée?
Quelqu'un peut demander: Quelle est la portée de la variable A? J'ai demandé à nouveau plus tard: quelle est la portée de la fonction A? Quelles sont les portées des variables et des fonctions?
Voyons d'abord ce que signifie «portée». Lorsque la «portée» est décomposée, cela signifie «fonction» et «domaine»
La portée est la gamme accessible de variables et de fonctions, ou la zone dans laquelle fonctionnent les variables ou les fonctions.
1.Scope de la fonction JavaScript:
La zone de la fonction est la portée de la fonction, et les variables et les fonctions peuvent accéder aux opérations dans ce domaine. La zone à l'extérieur de la fonction la plus externe est appelée portée globale, et la zone à l'intérieur de la fonction est appelée portée locale.
2. Portée des variables JavaScript:
Dans la région où la variable est située dans le code source, la portée de cette variable est et la variable est accessible et opérée dans cette zone. Les variables définies dans la portée globale sont appelées variables globales, et les variables définies dans la fonction sont appelées variables locales.
Pour comprendre simplement, le code source JS est divisé en zones de bloc par fonction {}. Si ces zones modifient leur identité, elles sont la portée d'une certaine fonction ou d'une certaine variable. La portée d'une variable et la portée d'une fonction peuvent se référer à la même zone dans le code source.
Chaîne de portée
La chaîne de portée est un mécanisme de recherche variable et de fonction dans JavaScript. Il détermine la portée des variables et des fonctions, c'est-à-dire la portée. Comprenez le principe de la chaîne de portée, et vous pouvez comprendre les trois exemples de l'article précédent, afin que vous puissiez connaître la raison et la raison.
La chaîne de portée est un concept dans la documentation ECMAScript-262. Le moteur JavaScript est implémenté selon la documentation ECMAScript-262. La compréhension du principe de travail du moteur JavaScript est propice à notre compréhension des caractéristiques de JavaScript, mais la plupart des programmeurs JS ne comprendront pas des technologies très sous-jacentes. Par conséquent, lors de la lecture de la documentation ECMAScript-262, nous pouvons avoir un moyen intuitif de simuler le principe de travail du moteur JavaScript.
Cet article expliquera le principe de la formation de chaînes de portée par le biais de la troisième édition de ECMAScript-262-3th en 1999, et présentera plusieurs concepts tels que l'environnement d'exécution, les objets variables et les objets actifs, les objets d'arguments, les chaînes de portée, etc. En 2009, la cinquième édition d'ECMAScript-262-5th a été publiée. La différence était que les concepts tels que les objets variables et les objets actifs ont été annulés, et de nouveaux concepts tels que les environnements lexicaux et les enregistrements d'environnement ont été introduits, alors ne confondez pas les concepts des deux versions.
1. contextes d'exécution
Les contextes d'exécution sont également traduits en contexte d'exécution. Lorsque l'analyseur entre dans le code exécutable d'ECMAScript, l'analyseur entre dans un environnement d'exécution. L'environnement d'exécution actif forme une pile logique. L'environnement d'exécution en haut de cette pile logique est l'environnement d'exécution en cours d'exécution.
Remarque: Il existe trois types de code exécutable dans ECMascript, Global, Function et Eval. L'environnement global est le code exécutable global et les fonctions sont du code exécutable de fonction. La pile logique est un format de stockage de données spécial, caractérisé par «d'abord dans et hors, puis dans et hors». L'ajout de données sera d'abord poussé dans le haut de la pile logique et la suppression des données doit être supprimée du haut.
Objet variable, objet actif et objet d'arguments
Chaque environnement d'exécution a un objet variable qui lui est associé. Lorsque l'analyseur entre dans l'environnement d'exécution, un objet variable sera créé, qui contient des références aux variables et aux fonctions déclarées dans l'environnement d'exécution actuel.
L'objet variable est un concept abstrait. Dans différents environnements d'exécution, les objets variables ont des identités différentes. Avant que l'analyseur entre dans un environnement d'exécution, un objet global est créé. Lorsque l'analyseur entre dans l'environnement d'exécution global, l'objet global agit comme un objet variable. Lorsque l'analyseur entre dans une fonction, un objet actif sera créé en tant qu'objet variable.
2. Deux étapes lorsque l'analyseur traite le code
Nous savons tous que JavaScript Parser analyse le code un par un, est-ce un tapis? Cela implique deux étapes lorsque l'analyseur traite le code, analysant le code et exécutant le code.
Lorsque l'analyseur entre dans l'environnement d'exécution, l'objet variable ajoutera des variables et des fonctions déclarées dans l'environnement d'exécution comme propriétés, ce qui signifie que les variables et les fonctions sont disponibles avant la déclaration et que la valeur variable n'est pas définie. C'est la raison de la promotion des variables et des déclarations de fonction (histing). Dans le même temps, la chaîne de portée et cela sont déterminées. Ce processus est l'étape d'analyse, communément appelée pré-parsing. Ensuite, l'analyseur commence à exécuter le code, ajoute une référence à la valeur correspondante à la variable et obtient le résultat d'exécution. Ce processus est l'étape d'exécution.
Nommez deux délicieuses châtaignes:
var a = 123; var b = "ABC"; fonction c () {alert ('11 ');}Après l'analyse du code et l'exécution dans l'environnement global ci-dessus, l'objet global sera utilisé comme objet variable et les données suivantes seront enregistrées.
fonction testfn (a) {var b = "123"; fonction c () {alert ("ABC"); }} testfn (10);Lorsque l'analyseur entre dans l'environnement d'exécution de la fonction, un objet actif sera créé en tant qu'objet variable. L'objet actif créera également un objet d'arguments. L'objet Arguments est un paramètre défini pour enregistrer les paramètres. C'est pourquoi nous pouvons utiliser des arguments [0] et ainsi de suite lors de l'écriture de fonctions.
3. Chaîne de portée
Chaque environnement d'exécution a une chaîne de portée associée. Il est défini lorsque l'analyseur entre dans l'environnement d'exécution. La chaîne de portée est une liste d'objets utilisée pour récupérer les variables et les fonctions dans chaque objet variable. Cela garantit que l'environnement d'exécution a le droit d'accéder aux variables et aux fonctions. Par exemple, c'est un châtaignier.
var a = '123'; fonction testfn (b) {var c = 'abc'; fonction testfn2 () {var d = 'efg'; alerte (a); } testfn2 ();} testfn (10);La variable A n'est pas déclarée dans TestFN2. Pourquoi TestFN2 peut-il appeler la variable globale A? Comment l'ensemble du processus s'est-il produit? Veuillez consulter l'image ci-dessous.
Lorsque l'analyseur entre dans l'environnement d'exécution global, les variables et les fonctions ne se trouvent que dans l'objet global lors de les appels.
Lorsque l'analyseur entre dans l'environnement d'exécution de la fonction TestFN, la propriété interne de la fonction [[SCOPE]] est d'abord remplie de l'objet global, puis l'objet actif TestFN est ajouté à l'objet global pour former une chaîne de portée.
Lorsque l'analyseur entre dans l'environnement d'exécution de la fonction TestFN2, la propriété interne de la fonction [[SCOPE]] est d'abord remplie de la chaîne de portée des parents, puis l'objet actif TestFN2 actuel est ajouté à l'extrémité avant de la chaîne de portée pour former une nouvelle chaîne de portée.
Lorsque TestFN2 appelle la variable A, recherchez d'abord dans l'objet actif TestFN2 actuel. S'il n'est pas trouvé, suivez la chaîne de portée vers le haut. S'il n'est pas trouvé, recherchez la chaîne de portée. S'il n'est pas trouvé, recherchez la chaîne de portée tant qu'elle ne se trouve pas dans le dernier objet global, sinon une erreur sera signalée. Par conséquent, les variables de l'environnement externe peuvent être appelées à l'intérieur de la fonction, et les variables de l'environnement externe ne peuvent pas être appelées à l'intérieur de la fonction. Ceci est le principe des caractéristiques de la portée.