Parlons d'abord de ce qu'est la segmentation de mots. La segmentation de mots consiste à décomposer une chaîne de caractères en blocs de code significatifs pour le langage de programmation. Ces blocs de code sont appelés jetons. Par exemple, le code var a = 2
sera décomposé dans les unités lexicales suivantes. Plus précisément : var,a,=,2.
Remarque : La segmentation des mots consiste en fait à diviser l'intégralité du code ci-dessus en segments.
L'analyse syntaxique consiste à convertir le flux d'unités lexicales en un arbre composé d'éléments imbriqués niveau par niveau, qui représente la structure grammaticale du programme. Cet arbre s'appelle : arbre de syntaxe abstraite. Compte tenu des mots standards trop longs ici, nous ne les considérerons pas, je les afficherai directement sous une forme plus intuitive. Les détails sont les suivants :
Analyse : L'arbre de syntaxe abstraite aura un nœud de niveau supérieur var, suivi d'un nœud enfant avec la variable a et d'un nœud avec l'opérateur d'affectation =. Il y a un autre nœud enfant de 2 sous le symbole d'affectation. Plus précisément, cela correspond au code var a = 2
.
Le processus de conversion d'un arbre syntaxique abstrait en code exécutable est appelé génération de code. Ce processus est étroitement lié à la langue et à la plateforme cible. En termes simples, il existe un moyen de convertir l'arbre syntaxique abstrait de var a = 2
en instructions machine. Utilisé pour créer une variable appelée a et stocker une valeur dans a.
reposent principalement sur le moteur pour exécuter du code JavaScript. Lorsque le moteur exécute var a = 2, il déterminera si la variable a a été déclarée en la recherchant. Le processus de recherche est assisté par des étendues. Pendant le processus de requête, le moteur effectuera une requête LHS (requête gauche) pour la variable a et une requête droite pour la valeur. Pour faire simple, lorsque la variable apparaît sur le côté gauche de l'opération d'affectation, une requête LHS est effectuée, et lorsqu'elle apparaît sur le côté droit, une requête RHS est effectuée. Pour être plus précis, la requête LHS tente de trouver le conteneur de la variable elle-même, tandis que la requête RHS tente d'obtenir sa valeur source.
Remarque : Dans la fonction, il y aura à la fois des requêtes LHS et RHS. Parce que lors du processus de transmission des paramètres, le code effectuera une affectation implicite.
Lorsque la variable n'a pas été déclarée, le comportement de la requête LHS et de la requête RHS est différent.
fonction foo(a){ console.log(a+b); b=a;}foo(2)
Remarque : La première requête de droite sur b ne peut pas trouver la variable, ce qui signifie qu'il s'agit d'une variable non déclarée car elle ne peut être trouvée dans aucune portée pertinente. Si RHS ne trouve pas les variables requises dans la portée imbriquée, le moteur lèvera une exception.
foo(a){ varb=a; retourner a+b ; }problème
var c=foo(2)
: trouver toutes les requêtes LHS et RHS
Réponse : LHS(c=…,a=2,b=…) et RHS(foo(2…,=a,a…,…b))