Cet article décrit les techniques pré-parsy et connexes JavaScript. Partagez-le pour votre référence, comme suit:
variable
Encore une fois, commencez par les invites de comparaison d'erreur de ces deux petits exemples.
alerte (y1); // Segment de code 1Var y1 = 'dddd'; alert (y2); // Segment de code 2 // alerte (typeof y2); y2 = 'xxxxx';
Réfléchissons d'abord pourquoi on invite non défini, et l'autre lance l'erreur des variables non définies. . Examinons d'abord le processus d'analyse JavaScript.
Avant le processus d'exécution, JavaScript fera un "préparations" de l'événement. Le moteur d'analyse effectue la création de toutes les variables VAR au niveau du bloc et leur donne une valeur initiale: non définie. De cette façon, la raison pour laquelle le premier exemple apparaît indéfini est évident.
Donc le premier code est en fait équivalent à
var y1; alerte (typeof y1); // Naturellement, sa valeur est undefinedy1 = 'dddd';
Pourquoi le deuxième morceau de code a-t-il à nouveau jeté le mal? Il n'appartient plus à l'étape "pré-parse" (ici, je suppose que le navigateur ne fait que deux choses lors de la rencontre d'une balise de script: pré-parse et exécution, qui n'est en fait pas seulement ces deux choses). Cependant, à l'étape d'exécution, la raison de lancer l'erreur est que JS ne connaît pas l'état de Y2 dans l'état du segment d'exécution (aucune information de Y2 n'a été capturée à l'étape pré-parsement), et bien sûr, il lance des informations d'erreur indéfinies. Un autre problème est impliqué ici: JS est un langage de type faible, et les variables peuvent être utilisées sans définition, alors pourquoi est-elle lancée ici comme une erreur de définition?
Il y a toujours une raison pour que les choses se produisent. JavaScript a toujours de nombreuses fonctionnalités étranges, et il existe une variable qui est lue et écrite inégale. Les variables non définies ne sont que des écrivains et non lisibles. Que peut-il être écrit? Tout le monde connaît cette méthode d'écriture:
y2 = 'examen'; // Avant que son opération de définition n'apparaisse (c'est-à-dire avant de ne pas avoir sa propre portée), cette opération examinera ce code pour définir une variable globale, enregistrer une propriété Y2 sur la fenêtre et l'attribuer à l'examen
Mais lors de la lecture, le moteur JS ne trouve aucune information connexe à ce sujet, il agit donc avec son propre caractère et fait une erreur indéfinie sans hésitation. C'est la règle du jeu de JS. Et pourtant, pourquoi pouvez-vous obtenir son type? N'oubliez pas les opérations de JS sur les objets. Si vous accédez à un objet qui n'existe pas, il invitera non défini (car il s'agit actuellement d'un attribut de l'objet Window).
Remarque: il est nécessaire de distinguer ici que les variables de lecture et d'écriture inégales ne sont utilisées que pour les variables, et toutes les propriétés des objets sont lues. Cette fonctionnalité n'existe pas. S'il n'existe pas, il invitera non défini.
en conclusion
À ce stade, mes pensées résultent: il existe certaines similitudes dans les opérations d'écriture des variables et des objets. Cependant, chacun a son propre ensemble de règles pour la lecture des opérations. Pour cette raison, les problèmes ci-dessus sont rencontrés.
De cette façon, la question suivante doit être facilement répondue.
if (! ('a' dans la fenêtre)) {var a = 1;} alert (a);fonction
Pour l'étendre, fonction. N'oubliez pas le pré-parsement mentionné ci-dessus. Dans le pré-parsement de JavaScript, en plus de la prédéfinition des variables VAR, il comprend également l'extraction de la définition de la fonction, de sorte que la fonction peut être définie n'importe où dans le script et appelé n'importe où. Pas limité à l'avant.
Cependant, la méthode de définition de fonction comprend une méthode de définition littérale, en utilisant la méthode de VAR pour déclarer la fonction. Voir ci-dessous
alerte (typeof y3); // résultat? Var y3 = function () {console.log ('1'); }N'oubliez pas cet accord: l'appel doit comparaître après la déclaration. Pourquoi? Si vous comprenez ce qui précède, la réponse ici est en fait claire. Lors du VAR pré-parsing, le moteur JavaScript leur donnera une valeur initiale non définie. De cette façon, si nous l'appelons avant sa déclaration, le moteur JavaScript n'a pas encore obtenu sa valeur réelle, il rapportera naturellement l'erreur de "XXX n'est pas une fonction". Cela clarifie également pourquoi les deux déclarations de fonction sont liées à l'ordre des déclarations et des appels, et l'autre n'a pas de telles contraintes.
en conclusion
C'est une fonction, le résultat de l'exécution JS et de la modification dynamique, et il suit toujours les règles de pré-analyse des variables (lors de l'alerte ci-dessus, il n'a pas obtenu les informations de la fonction littérale).
Et si c'est un mélange de deux. Regardez ce qui suit, il existe à la fois des variables et des fonctions pour Y4.
alerte (typeof y4); // Résultat? Fonction y4 () {console.log ('y4')} var y4;Étant donné que JavaScript a une priorité élevée en pré-pat, Y4 est naturellement un type de fonction, mais une fois Y4 attribué (le moteur JS est en cours d'exécution), son opération d'attribution à JS remplacera la déclaration de fonction. donc:
alert (typeof y5); var y5 = 'angle'; fonction y5 () {console.log ('fantôme'); } alert (y5);Le premier résultat d'alerte est une fonction car elle est en haut du processus d'exécution JS. La deuxième fois que l'alerte est renommée, sa valeur a été réécrite à 5 (ne soyez pas confus par la position de définition de la fonction ci-dessous.)
En pensant à l'analyse et à l'exécution de JS, j'ai réalisé que je me suis soudainement réalisé que les réponses à de nombreuses questions ont naturellement fait surface. Comme l'auteur de cet article l'a dit: "Une fois que vous comprenez les concepts d'environnement d'exécution, les objets d'appel, les fermetures, la portée lexicale et les chaînes de portée, de nombreux phénomènes dans le langage JS peuvent être résolus facilement."
En regardant en arrière maintenant, même dans cette langue incroyable, il y a de nombreuses raisons qui peuvent y retourner.
Comment faire de meilleurs jugements de paramètres
Après avoir discuté de tant de personnes ci-dessus, comment peut-elle être plus proche du développement réel? Depuis la lecture et l'écriture de JavaScript, comment pouvons-nous éviter de porter des jugements de paramètres sans signaler les erreurs?
Par exemple:
if (cusvar) {// Le jugement ici est un problème implicite. }Comment être plus rigoureux.
if (fenêtre ['cusvar']) {// Assurez-vous qu'il ne signale pas d'erreur. // ou un tel jugement est également une fenêtre réalisable.cusvar | Typeof CUSVAR! == 'Undefined' // Work}Enfin, un autre petit quiz est ajouté (comprendre la séparation de la pré-parsage et de l'exécution)
var y7 = 'test'; fonction fun1 () {alert (y7); var y7 = 'sex';} fun1 ();Pour plus d'informations sur le contenu lié à JavaScript, veuillez consulter les sujets de ce site: "Résumé des effets et techniques de commutation JavaScript", "Résumé des effets et techniques de recherche JavaScript", "Résumé des erreurs Javascript et des techniques de débogage" Algorithmes et techniques de traversée JavaScript ", et" Résumé de l'utilisation des opérations mathématiques JavaScript "
J'espère que cet article sera utile à la programmation JavaScript de tous.