J'ai passé beaucoup de temps aujourd'hui à revoir la portée, la précompilation, etc.
J'ai lu beaucoup d'articles de blog et ouvert des livres que j'avais lus auparavant (il semble que beaucoup de livres ne parlent pas à propos de la précompilation) )
J'ai découvert que je pensais l'avoir appris clairement au début, mais en fait il y a encore des malentendus
(De nombreux articles de blog sont trompeurs)
J'ai réglé les idées en désordre ce soir
Triez d'abord les pré-compilés Connaissances, j'expliquerai la portée en détail quand j'aurai le temps dans le futur
Tout le monde doit comprendre que cette pré-compilation est différente de la compilation traditionnelle (vous pouvez comprendre que la pré-compilation js est un processus de compilation spécial)
JavaScript est un langage interprété
Puisqu'il s'agit d'un langage interprété, cela signifie compiler une ligne et exécuter une ligne
La compilation traditionnelle passera par de nombreuses étapes. , comme la segmentation de mots, l'analyse et la génération de code
Je vous donnerai plus d'informations quand j'aurai le temps à l'avenir
Laissez-moi partager avec vous ce que je comprends de la pré-compilation JS
L'analyse de la syntaxe est très simple, c'est-à-dire que le moteur vérifie votre code pour toute erreur de syntaxe de bas niveau
Explication et exécution, comme son nom l'indique, consiste à exécuter le code
Pré- La simple compréhension de la compilation consiste à ouvrir de l'espace dans la mémoire et à stocker certaines variables et fonctions
Comprendre la pré-compilation est également utile pour que chacun comprenne la portée
Quand la pré-compilation a-t-elle lieu ?
J'espère que vous ne laissez pas le processus en cours ci-dessus vous amener à mal comprendre .
Malentendu selon lequel la précompilation ne se produit qu'avant l'exécution du bloc de code dans le script
Ce n'est pas faux
La précompilation se produit avant l'exécution dans le code du script
Mais la plupart d'entre elles se produiront
se produire avant l'exécution de la fonction
<script> var a = 1;// 变量声明 function b(y){//函数声明 var x = 1; console.log('so easy'); }; var c = function(){//是变量声明而不是函数声明!! //... } b(100);</script><script> var d = 0;</script>
//伪代码GO/window = { //页面加载创建GO同时,创建了document、navigator、screen等等属性,此处省略 a: undefined, c: undefined, b: function(y){ var x = 1; console.log('so easy'); } }
//伪代码 GO/window = { //变量随着执行流得到初始化 a: 1, c: function(){ //... }, b: function(y){ var x = 1; console.log('so easy'); } }
//伪代码AO = { //创建AO同时,创建了arguments等等属性,此处省略 y: 100, x: undefined}
Les déclarations de variables et de fonctions se produisent pendant la phase de pré-compilation, il n'y a pas de comportement d'initialisation (affectation) et les fonctions anonymes ne participent pas à la pré-compilation
Seule l'initialisation des variables sera uniquement effectué pendant la phase d'interprétation et d'exécution Eh bien ~ enfin conclure
Créer un objet AO ( Objet actif)
2. Recherchez les paramètres de fonction et les déclarations de variables dans la fonction. Les noms de paramètres formels et les noms de variables sont utilisés comme attributs de l'objet AO, et la valeur est indéfinie
3. les paramètres sont unifiés et les valeurs réelles des paramètres sont attribuées. Donnez les paramètres formels
4. Recherchez la déclaration de fonction, le nom de la fonction est utilisé comme attribut de l'objet AO et la valeur est la référence de la fonction
.
1. Recherchez la déclaration de variable globale (y compris les déclarations de variable globale implicites, en omettant les déclarations var), le nom de la variable est un attribut de l'objet global et la valeur n'est pas défini
3. Recherchez la déclaration de fonction, le nom de la fonction est un attribut de l'objet global et la valeur est la référence de la fonction
Je résumerai également ces problèmes à l'avenir