Vous ne connaissez pas le volume de JavaScript 2/11

Partie I - Champ d'application et la fermeture

chapitre un

Quelles sont les possibilités

1. L' une des fonctions les plus élémentaires de presque toutes les langues de programmation, qui est la capacité de stocker la valeur d'une variable, et après cette valeur est accessible ou modifiée. En fait, il est cette capacité à stocker et accéder à la valeur de la variable sera l'état a le programme.

2.JavaScript avec les langages compilés traditionnels, ne sont pas compilés à l'avance, compilera les résultats ne peuvent pas être transplantées dans un système distribué.

3. Le processus de langages compilés traditionnels, compilateurs, « trois étapes »

   * Word / analyse lexicale

  Chaîne de caractères sera décomposé en (pour le langage de programmation) blocs significatifs (appelés unités lexicales jeton). Par exemple var a = 2, est décomposé en var, a, =, 2,;

   * Parsing / Analyse syntaxique

  L'unité lexicale écoulement (matrice) dans une cascade d'éléments imbriqués composés de l'arbre représente la structure syntaxique du programme (arbre de syntaxe abstraite syntaxe abstraite d'arbre, AST). Le var a = 2; le noeud d'arbre de syntaxe abstraite peut avoir appelé haut VariableDeclaration, suivi d'un identificateur connu (valeur a) un nœud enfant, le nœud de l'enfant et l'a appelé AssignmentExpression. AssignmentExpression noeud a des noeuds enfants appelés NumericLiteral (valeur 2)

   * Génération de code

  L'AST est converti en processus de code exécutable. L'AST est converti en un ensemble d'instructions de la machine pour créer une variable nommée, et une valeur stockée dans un.

Par rapport à seulement trois étapes du compilateur langage, moteur js est beaucoup plus complexe.

4. comprendre la portée de ce processus peut être modélisé comme un dialogue entre plusieurs tâches.

  * Moteur responsable de la compilation et le processus d'exécution du début à la fin tout le programme de JavaScript

  * Un bon moteur de compilateur ami est responsable de l'analyse et de génération de code travail sale

  * Un autre bon moteur de cadrage ami, responsable de la collecte et le maintien d'une série de requêtes par l'identificateur (variable) composé de tous déclarés et mis en œuvre un ensemble de règles très strictes qui déterminent le code en cours d'exécution accès à ces identifiants .

L' affectation des variables effectue deux actions, premier compilateur (si elle est déclarée inutile avant aussi), le moteur recherchera les variables du périmètre au moment de l' exécution, si elles pouvaient déclarer une variable dans le périmètre actuel il sera attribué.

La deuxième étape, le moteur a deux méthodes de recherche. LHS avec RHS. Comme son nom l'indique, LR représente le côté gauche, côté droit.

LHS (qui est la cible d'une cession), RHS (qui est la source d'une cession) est simplement le droit LHS d'une cession sur le côté gauche d'une affectation RHS

Par exemple la fonction foo (a) {

    console.log (a); // 2

}

  foo (2);

Le cas a = 2, une cible de l'opération est affectée à un LHS, où 2 est le paramètre passé dans l'allocation implicite, foo (...) est la source de l'affectation de tous les RHS, des moyens « pour trouver le foo valeur, et me le donner à, « il y a une console.log (..) lui-même exige une référence à effectuer, mais aussi sur la partie droite d'une référence.

Par exemple la fonction foo (a) {

    var b = a;

    retourner a + b;

}

  var c = foo (2);

Extrait écrit par quelqu'un d'autre pour voir ce que la bonne résolution de micro-blogging

Le code ci-dessus est de trois à quatre LHS RHS, comme suit:

Tout d'abord, le var c c doit être affecté, l'affectation sur le côté gauche, de sorte que le c de référence pour LHS

En second lieu, les besoins variables c à affecter, sa valeur est foo (2), alors la valeur foo (2) est combien, vous devez trouver la valeur de foo (2), le côté droit de l'affectation, de sorte que le foo (2 ) ont été cités RHS

En troisième lieu, l'affectation implicite, 2 passes à la fonction foo (a) {......} fonction d'un paramètre, un côté gauche de l'affectation, soit une LHS de référence

Quatrièmement, var b = a ;, b doit être attribué, sur le côté gauche de l'affectation, de sorte que la valeur de LHS b effectuée, b d'un à, la valeur d'un côté droit de venir? Cela nécessite l'attribution d'un côté droit de l'opération réalisée RHS.

En cinquième lieu, le retour a + b ;, nous devons trouver la source de la valeur a et b, a et b sont sur le côté droit d'une cession, pour obtenir la valeur d'un + b, donc a et b sont effectuées sur la référence RHS.

 6. Lorsqu'un bloc fonctionnel ou imbriqué dans un autre bloc ou fonction, ont eu lieu les portées imbriquées.

  références LHS et RHS regardera dans le périmètre actuel, sinon trouvé, cherchera à champs plus élevés jusqu'à ce que la portée mondiale. La portée mondiale, le processus de recherche arrêtera de toute façon.

7. Pourquoi distinguer entre LHS et RHS est une chose importante

 

fonction foo (a) { 
        console.log (a + b); 
        b = a; 
        c = {}; 
        console.log (c.list.name); 
} 
Foo ( 2);

La première fois à être b enquête RHS ne peut pas trouver la variable. Que les variables « non déclarées » dans la requête tous les champs imbriqués ne peuvent pas être trouvés, le moteur génère une erreur ReferenceError.  

 

 

 

Aux termes de comparaison, requête LHS, si la portée globale ne peut pas trouver la variable cible, la portée mondiale va créer une variable avec ce nom, et retourne son moteur, la mauvaise prémisse, « mode strict. »

Si la requête à la variable RHS, mais la variable est une opération déraisonnable. Par exemple, une valeur de type non-fonction d'un appel de fonction, ou une référence à la valeur d'attribut de nul ou de type non défini, jeter TypeError , bien sûr, ce qui précède d' abord supprimé et b RHS de fonctionnement erroné, car la mise en œuvre n'est pas supprimé au moment où la première requête avait eu tort de ne pas exécuter la prochaine.

 

 

 

 

 

 

chapitre II

 

portée lexicales

 

1. Champ d'application Il existe deux modèles de travail principal. La première la plus commune, est utilisé par la plupart des langages de programmation, portée lexicale. Une autre portée dynamique appelée.

 

2. tromper lexical.

 

eval js dans (..) fonction accepte une chaîne comme paramètre, et le contenu traité comme si elle est la même que celle au moment de l'écriture, le moteur ne sait pas ou de soins si le code est inséré sous une forme dynamique, sera comme d'habitude pour en savoir.

 

 

fonction foo (str, a) { 
        eval (str); // !欺骗
        console.log (a, b); 
  } 
Var b = 2 ; 
foo ( "var b = 3;", 1); // 1,3

 

le eval (..) est souvent utilisé pour exécuter du code créé dynamiquement.

Remarque: En mode strict, a son propre champ lexical, ce qui signifie que eval ne peut pas être modifié lors de l'exécution.

            fonction foo (str) {
                 "use strict" 
                eval (str); 
                console.log (a); 
            } 
            Foo ( "var a = 2");

 

 

avec affectation de propriété objet simplifié

        fonction foo (obj) {
             avec (obj) { 
                A = 2 ; 
            } 
        } 
        var O1 = { 
            A: . 3 
        }; 
        var O2 = { 
            B: . 3  
        }; 
        foo (O1); 
        le console.log (o1.a); 
        foo (O2), 
        le console.log (o2.a), 
        le console.log (o2.b), 
        le console.log (A); // Une fuite variable globale

Voici pourquoi une fuite en tant que variable globale est principalement en mode non-stricte, l'appel à foo (o2) a 2 looks pour les LHS de =, ne peut pas trouver, puis définir une recherche d'une variable globale. Essayer les résultats suivants foo (o2) après la suppression.

 

 

 

 

Les effets secondaires de ces deux mécanismes est que le moteur ne peut pas trouver l'optimisation de la portée au moment de la compilation, parce que les moteurs ne peuvent mettent en garde que cette optimisation est invalide. Utilisez l'un de ces mécanismes conduira à exécuter du code plus lent. Il est donc préférable de ne pas les utiliser.

 

Je suppose que tu aimes

Origine www.cnblogs.com/ljg1998/p/12615370.html
conseillé
Classement