Mastering JavaScript Section 1 : concepts critiques | Steven Hancock | Skillshare

Vitesse de lecture


1.0x


  • 0.5x
  • 0.75x
  • 1 x (normale)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Mastering JavaScript Section 1 : concepts critiques

teacher avatar Steven Hancock, Founder All Things JavaScript

Regardez ce cours et des milliers d'autres

Bénéficiez d'un accès illimité à tous les cours
Suivez des cours enseignés par des leaders de l'industrie et des professionnels
Explorez divers sujets comme l'illustration, le graphisme, la photographie et bien d'autres

Regardez ce cours et des milliers d'autres

Bénéficiez d'un accès illimité à tous les cours
Suivez des cours enseignés par des leaders de l'industrie et des professionnels
Explorez divers sujets comme l'illustration, le graphisme, la photographie et bien d'autres

Leçons de ce cours

    • 1.

      Introduction aux concepts critiques de JavaScript

      1:31

    • 2.

      L'environnement d'exécution JavaScript

      6:13

    • 3.

      Comprendre le moteur JavaScript

      6:07

    • 4.

      La pile de souvenirs et d'appels

      13:54

    • 5.

      Comprendre la collection des ordures

      7:03

    • 6.

      Supprimer les auditeurs d'événements pour aider à la collecte des ordures

      5:52

    • 7.

      Comprendre la boucle d'événements

      7:34

    • 8.

      L'environnement d'exécution du noeud

      2:25

    • 9.

      Début de l'exercice : explorer la pile d'appels et la boucle d'événements

      3:01

    • 10.

      Fin de l'exercice : explorer la pile d'appels et la boucle d'événements

      4:06

    • 11.

      Comment JavaScript évolue

      8:23

  • --
  • Niveau débutant
  • Niveau intermédiaire
  • Niveau avancé
  • Tous niveaux

Généré par la communauté

Le niveau est déterminé par l'opinion majoritaire des apprenants qui ont évalué ce cours. La recommandation de l'enseignant est affichée jusqu'à ce qu'au moins 5 réponses d'apprenants soient collectées.

77

apprenants

--

projets

À propos de ce cours

Ce cours représente la première section de Mastering JavaScript. Dans ce cours, nous aborderons les concepts critiques. Ce cours peut ne pas beaucoup plonger dans le langage JavaScript, mais il répondra en effet à de nombreuses questions sur le fonctionnement de JavaScript et sur la raison pour laquelle certaines choses se produisent. Chaque programmeur JavaScript supérieur devrait comprendre ces concepts de base, mais importants.

Dans ce cours, nous abordons les concepts critiques suivants :

  • L'environnement d'exécution JavaScript
  • Le moteur JavaScript
  • La pile de souvenirs et d'appels
  • Collecte des ordures
  • Supprimer les auditeurs d'événements pour aider à la collecte des ordures
  • La boucle d'événements
  • L'environnement d'exécution du noeud
  • Comment JavaScript évolue

Comprendre ces concepts critiques est important pour vous placer au sommet de tous les développeurs JavaScript, alors sautez-vous et commencez.

Les conditions préalables et réglages : les conditions de ce cours sont assez fondamentales. Vous devez savoir comment entrer sur JavaScript. Il aide à comprendre certaines bases sur le langage afin que vous puissiez appliquer les concepts enseignés.

La configuration est assez facile. Nous n'utilisons aucune bibliothèque ou quelque chose de pareille, donc tout ce dont vous aurez besoin est un éditeur de texte et un navigateur. La majorité du code JavaScript que nous écrivons nous allons fonctionner dans un navigateur. Il y a une mention de Node.js, mais le code sera exécuté dans un navigateur. J'utiliserai Chrome.

Pour un éditeur de code, j'utiliserai Visual Studio Code. Il s'agit d'un éditeur gratuit et sur plate-forme qui est assez populaire. Donc, si vous n'utilisez pas actuellement le code de studio visuel et que vous aimeriez pendant ce cours, vous pouvez le télécharger ici.

Une fois que vous aurez terminé ce cours, je vous invite à passer à la section 2 : les bases essentielles.

Rencontrez votre enseignant·e

Teacher Profile Image

Steven Hancock

Founder All Things JavaScript

Enseignant·e

I have 20+ years experience in training and product development and 15+ years using JavaScript. I started learning JavaScript when it was a new language used for minor affects on web pages. The growth and ubiquitous nature of JavaScript both excites and inspires me.

Currently I am the President and Lead Trainer of All Things JavaScript, a resource for anyone and everyone that hopes to increase their JavaScript skills. Our goal is to assist in the journey from JavaScript novice to expert.

I have been the co-owner and President of Rapid Intake, an eLearning firm. The company was an ideal place to put my training and development skills to work. While there I managed all development and professional service related activities. I was heavily involved in the initial development ... Voir le profil complet

Level: All Levels

Notes attribuées au cours

Les attentes sont-elles satisfaites ?
    Dépassées !
  • 0%
  • Oui
  • 0%
  • En partie
  • 0%
  • Pas vraiment
  • 0%

Pourquoi s'inscrire à Skillshare ?

Suivez des cours Skillshare Original primés

Chaque cours comprend de courtes leçons et des travaux pratiques

Votre abonnement soutient les enseignants Skillshare

Apprenez, où que vous soyez

Suivez des cours où que vous soyez avec l'application Skillshare. Suivez-les en streaming ou téléchargez-les pour les regarder dans l'avion, dans le métro ou tout autre endroit où vous aimez apprendre.

Transcription

1. Introduction aux concepts critiques de JavaScript: Bienvenue dans cette section sur les concepts critiques en JavaScript. Dans cette section, nous allons aborder ce que je considère comme des concepts critiques concernant le langage et le fonctionnement de JavaScript. Certains d'entre vous voudront peut-être passer à deux sections qui se concentrent davantage sur l' aspect linguistique de JavaScript. Mais j'exhorte les patients, ces concepts sont essentiels. Maintenant, alors que vous commencez dans cette section, certains concepts peuvent sembler basiques parce qu'ils le sont. Mais même si vous travaillez avec JavaScript depuis un certain temps, je suis sûr que vous allez apprendre quelque chose. Alors tenez-vous-en à cela. Maintenant, pourquoi ces concepts sont-ils essentiels ? Pourquoi est-il important de comprendre le fonctionnement de la langue ? Parce qu'un élément essentiel de la compréhension de tout bon développeur est de savoir pourquoi vous faites certaines choses. Le y permet d'ajuster les modèles ou le code en fonction de vos besoins spécifiques. Ils facilitent la pensée critique. Et ces concepts expliquent pourquoi nous faisons beaucoup de choses en JavaScript, dont nous parlerons plus tard. En fait, dans les sections suivantes, vous souhaiterez peut-être revenir et revenir sur certains de ces sujets, tels que la boucle d'événements lorsqu'il s'agit de code asynchrone. Il est donc important de passer un peu de temps à parler du moteur JavaScript, la pile d'appels, du tas de mémoire. Le fait que JavaScript soit un thread unique, l'environnement d'exécution et la boucle d'événements. Alors allons-y. 2. L'environnement d'exécution du JavaScript: Pour que nous puissions utiliser JavaScript, avons besoin d'un environnement dans lequel il s'exécutera. Maintenant, JavaScript ne nécessite pas beaucoup d'outils pour écrire du code. En fait, nous pouvons simplement ouvrir un simple éditeur de texte et commencer à écrire du JavaScript. Mais pour que ce code ait du sens ou fasse quoi que ce soit, nous devons le rendre disponible dans un environnement d'exécution JavaScript. Il existe désormais deux environnements d'exécution principaux qui constituent la majorité de l'utilisation de JavaScript le navigateur et NodeJS. Nous pouvons donc exécuter JavaScript et effectuer certaines tâches à l'aide du navigateur ou du nœud. Ces deux environnements ne sont pas les seuls que nous pouvons utiliser, mais ils sont les plus importants et les plus répandus. Maintenant, il existe des similitudes entre le nœud et les navigateurs, puis il y a quelques différences. Parlons-en brièvement. abord, un navigateur et un nœud sont tous deux simplement une application. Dans tous les cas, ils doivent être installés sur votre ordinateur pour pouvoir les utiliser. Nous avons installé Node plus tôt dans le cours. Lorsque je démarre un navigateur, en l'occurrence Chrome, je lance cette application depuis mon ordinateur. Maintenant, il en va de même pour le nœud. Nous l'utilisons simplement différemment. Nous devons l'utiliser depuis le terminal ou l'invite de commande. Et nous n' utilisons généralement pas d'interface graphique. Par exemple, je peux accéder au nœud en le tapant. Et maintenant, j'ai une invite de nœud. C'est ainsi que j'utilise node. Une autre similitude est que ces applications, c'est-à-dire à la fois le navigateur et le nœud, sont écrites dans le même langage informatique. Maintenant, dans le cas de Chrome et de la plupart des navigateurs, le cœur de cette application est écrit en C plus plus. L'interface graphique est généralement un langage différent, mais le noyau est C plus plus plus. Maintenant, le noyau de NodeJS est également écrit en C plus plus avec du code JavaScript qui agit comme un wrapper pour certaines des commandes que nous utilisons. Le code. Ces deux applications sont écrites dans le navigateur et le nœud est très similaire, mais ce n'est pas ce qui nous permet d' utiliser JavaScript dans chacun de ces environnements. Pour qu'un environnement d'exécution JavaScript autorise l'utilisation de JavaScript, il a besoin de quelque chose pour interpréter le langage, lire le code JavaScript et le traduire pour l'ordinateur. Cet élément très important s'appelle le moteur JavaScript. Un navigateur et un nœud nécessitent tous deux un moteur JavaScript pour utiliser JavaScript. Désormais, le moteur JavaScript n'est qu'une partie de l' ensemble de l'application. Il y a beaucoup d' autres éléments dans un navigateur et il y a beaucoup d'autres éléments à nœud. Jetons un coup d' œil à un diagramme qui illustre l' environnement d'exécution de notre navigateur. Ce sont toutes les pièces dont nous allons parler car nous interagissons avec elles lorsque nous utilisons JavaScript dans le navigateur. Donc, si tout cela représente le navigateur et ce qu'il contient, nous pouvons voir qu'il y a des éléments qui ne font pas partie du moteur JavaScript, qui est représenté ici. Nous faisons parfois des choses en JavaScript qui utilisent des parties de l'application du navigateur qui ne partie du moteur JavaScript. Maintenant, ces autres parties ou éléments sont quelques-unes des choses qui sont différentes entre un navigateur et celles connues. Par exemple, dans un navigateur, nous interagissons avec le DOM, largement représenté ici dans les API Web. Eh bien, ce n'est pas quelque chose que nous faisons dans Node. Aucun DOM ne fait partie du nœud. Cependant, la connaissance permet d' effectuer d'autres types de tâches. Tâches requises sur un serveur, telles que l'écriture d'un fichier sur un disque dur ou le démarrage d'un serveur. Ce sont des choses que nous ne pouvons pas faire dans un navigateur. Il y a donc quelques différences. Jetons un coup d'œil à une autre différence très rapidement. Donc, ici, dans un navigateur, si j'ouvre la console, je peux afficher la fenêtre. Cela affiche l'objet de la fenêtre. Il s'agit de l'environnement global dans lequel nous écrivons du code. Lorsque nous écrivons, JavaScript se trouve à l'intérieur de la fenêtre. Et il y a beaucoup de choses associées à la fenêtre, que nous pouvons utiliser. Maintenant, le nœud n'a pas de fenêtre. Si nous tapons fenêtre ici, référence non capturée, notre fenêtre n'est pas définie. Cependant, nous pouvons taper global. Et nous obtenons des informations sur le monde. Et ce serait l'équivalent de Window côté navigateur. Maintenant, bien sûr, il va y avoir des similitudes. Par exemple, vous pouvez voir setTimeout ici dans global. Settimeout est également disponible dans le navigateur. Vous pouvez voir que ce n'est pas dans le moteur JavaScript. Cela fait en fait partie de l'API Web. Même chose avec Node. Il ne fait pas partie du moteur JavaScript, mais nous y avons accès. Et nous pouvons faire quelque chose comme console.log ici. Et tout comme nous pouvons le faire dans un navigateur. Maintenant, dans les prochains sujets, nous allons parler de ces différentes parties d'un navigateur, car elles sont essentielles à comprendre. Pour écrire efficacement, JavaScript. Node comporte également des parties supplémentaires, mais nous nous concentrerons principalement sur le navigateur. abord, nous allons parler du moteur JavaScript. 3. Comprendre le moteur JavaScript: En termes simples, le moteur JavaScript est un programme qui exécute du code JavaScript. Donc, en regardant notre diagramme, si nous avons du code JavaScript, le moteur JavaScript qui est en charge. C'est la seule pièce qui sait quoi faire avec le code. Cela le traduit en quelque chose que l' ordinateur peut comprendre. À l'origine, les moteurs JavaScript étaient des interprètes, ce qui signifie qu'ils traitaient le code JavaScript ligne par ligne, convertissaient en bytecode pour qu'il puisse s'exécuter. Les interprètes sont fermés pour commencer à exécuter le code, ce qui était nécessaire dans l'environnement du navigateur. Mais ils peuvent être globalement plus lents par rapport à la compilation du code. code compilé convertit le programme en code machine afin qu' il fonctionne de manière optimisée. Les derniers moteurs JavaScript sont beaucoup plus optimisés. Ils utilisent à la fois un interpréteur et juste à temps, compilation ou un compilateur JIT pour optimiser le code. Cela permet de tirer le meilleur parti des deux mondes. Sa compilation prend du froid qui peut être optimisé et la compile. Par exemple, si un morceau de code s'exécute beaucoup, il peut être compilé en code machine. Ensuite, lorsque ce morceau de code s'exécute, il est optimisé et donc plus rapide. Maintenant, il existe un certain nombre de moteurs JavaScript. Celui qui est probablement le plus connu est le moteur V8. Il s'agit du moteur utilisé dans le navigateur Chrome et également dans Node. Ce moteur a été écrit par Google pour Chrome en utilisant C plus plus. Et il est open source. C'est probablement le moteur le plus connu car lors de sa construction, il a amélioré la vitesse des moteurs JavaScript existants. Google utilisait JavaScript pour faire des choses assez étonnantes à cette époque. Pensez aux différentes applications Google écrites avec JavaScript. Quoi qu'il en soit, ils voulaient qu'il soit plus performant. Ils ont donc écrit le moteur V8 pour accomplir exactement cela. D'autres moteurs JavaScript ont emboîté le pas afin rendre leurs moteurs plus performants également. Cette amélioration des performances est importante pour être conscient de l'idée d' utiliser un compilateur JIT avec un interpréteur pour aider à optimiser le code. La raison pour laquelle c'est important parce que nous parlons d'écrire du code de certaines manières pour le rendre plus performant ou éviter des éléments dans notre code qui pourraient le rendre moins performant. Cela tient souvent à la façon dont le moteur JavaScript gère le code et est capable de l'optimiser. Maintenant, voici quelques autres moteurs JavaScript que vous avez peut-être rencontrés. Nous avons déjà mentionné que V8 était open source, développé par Google. Il est utilisé dans Chrome et NodeJS. Singe-araignée. C'était le premier moteur JavaScript, et il est aujourd'hui utilisé dans Firefox. Et d'ailleurs, le premier moteur JavaScript a été écrit par Brendan Eich lorsqu'il a inventé le JavaScript, et comme le raconte l'histoire, il l' a fait en dix jours. Maintenant, le noyau de JavaScript est également open source et a été développé par Apple pour Safari. C'est donc le moteur qu'utilise Safari. Un autre élément que nous devrions probablement mentionner est le chakra. Et ceci est utilisé dans Microsoft Edge. Donc, le moteur JavaScript de Microsoft. Maintenant, avec tous ces différents moteurs JavaScript dans différents navigateurs, comment savons-nous que le code JavaScript que nous écrivons fonctionnera de la même manière dans chaque navigateur ? Au début de l'histoire de JavaScript, c'était un réel problème. Il y avait des différences. À cette époque. Nous avons passé beaucoup de temps à nous inquiéter des différences entre les navigateurs. Des bibliothèques comme jQuery aident à résoudre ce problème et sont devenues très populaires à cause de cela. Maintenant, en raison de ces différences, il fallait une norme et c'est là que le script Acme entre en jeu. Il s'agit d'une norme que JavaScript suit. Un script AGMA est une spécification que tous les moteurs JavaScript suivent désormais. Cela permet plusieurs implémentations indépendantes, mais cela garantit que notre code fonctionne de la même manière. Ainsi, lorsque des modifications sont apportées à la norme de script, les Indiens doivent être mis à jour pour prendre en charge ces modifications. Certaines mises à jour sont plus rapides que d'autres. Et c'est pourquoi nous avons des sites comme celui-ci. Puis-je utiliser le site .com qui nous indique quels navigateurs prennent en charge certaines implémentations ? Nous pouvons donc voir l'historique des différents navigateurs et la date à laquelle ils ont commencé à prendre en charge les modules ES dans cet exemple. Maintenant, c'est aussi pour cela que nous utilisons un transpiler. Un transpiler tel que babble vous permet d'écrire du code en utilisant le standard de script Ekman le plus léger, mais génère ensuite du code JavaScript vers un standard plus ancien. Il s'agit donc d'une forme antérieure de JavaScript que les anciens moteurs de navigateur peuvent exécuter. Cela peut également être appelé un compilateur car techniquement, vous compilez du code sous une autre forme et dans une ancienne version de JavaScript. Très bien, cela suffit donc pour les moteurs JavaScript. Nous devons maintenant entrer dans les détails et parler du tas et de la pile d'appels au sein des moteurs. Ces deux éléments sont fréquemment utilisés lors du codage en JavaScript, même si vous ne le saviez peut-être pas. 4. Le t-shirt de la mémoire et la pile d'appels: Nous allons maintenant examiner deux fonctionnalités du moteur JavaScript qu'il est important de comprendre tas de mémoire et la pile d'appels. Ils sont utilisés lors de l'exécution du code. Je vais d'abord décrire chacun d'entre eux, puis nous les verrons en action pour mieux comprendre comment ils sont impliqués dans l'exécution du code. Maintenant, comme son nom l'indique, le tas de mémoire comme son nom l'indique, le est lié à l'allocation de mémoire. Chaque fois que vous définissez une fonction d'objet variable, quelque chose comme ça dans votre code, il doit y avoir un endroit pour la stocker. Donc, comme ces variables elles seraient stockées dans le tas de mémoire. Chaque fois qu'une déclaration est rencontrée, telle que celle-ci, la valeur est placée dans le tas de mémoire, puis l'emplacement de cette valeur est placé dans la variable. Ensuite, chaque fois que le code a besoin de cette valeur, de cette fonction ou de tout autre élément stocké, il utilise l' emplacement de la mémoire pour la rechercher. Maintenant, la mémoire dispose d'une quantité de mémoire limitée, sorte que les programmes complexes contenant de nombreuses variables et des objets imbriqués peuvent consommer cette mémoire. Le moteur JavaScript essaie de libérer de la mémoire en effaçant du programme les données qu'il juge inutiles. Ce processus s'appelle la collecte des ordures. Il y a des choses que vous pouvez faire en tant que programmeur pour aider à la collecte des ordures. Et il y a des choses que vous pourriez faire qui pourraient l'empêcher. Nous examinerons cela plus en détail dans la rubrique sur la collecte des ordures. Mais pour l'instant, parlons de la pile d'appels. Chaque fois que nous exécutons du code, la pile d'appels est utilisée. Il s'agit simplement d'un endroit en mémoire qui garde une trace de la fonction exécution et des fonctions qui vont être exécutées par la suite. Donc, l'ordre dans lequel ces commandes sont exécutées. Maintenant, chaque fonction est placée au-dessus de la fonction précédente. La première fonction se trouve donc en bas de la pile d'appels. Et puis, comme les autres fonctions sont appelées, elles sont placées au-dessus. La pile d'appels suit donc une approche du premier entré, dernier sorti. Désormais, dès que la fonction ou commande est terminée, elle est supprimée de la pile d'appels. Maintenant, comme vous pouvez le voir sur le diagramme, il n'y a qu'une seule pile d' appels représentée. Le moteur JavaScript ne possède qu' une seule pile d'appels pour traiter les commandes en cours d'exécution. C'est parce que JavaScript est à thread unique, un terme dont vous avez peut-être entendu parler. Désormais, un seul thread signifie que le moteur JavaScript ne peut exécuter qu'une partie du programme à la fois. La pile d'appels traite donc une commande à la fois. ce fait, JavaScript est synchrone. Les commandes ne peuvent être exécutées qu'une seule à la fois. Vous pouvez probablement y voir un problème. Et si nous invoquions une fonction dont exécution nécessite beaucoup de temps ? Comment pouvons-nous empêcher que cela ne bloque d'autres codes ? Par exemple, nous voulons qu'un utilisateur puisse cliquer sur un bouton sans avoir à attendre deux secondes pour que du JavaScript se termine avant de pouvoir répondre à ce bouton. Nous verrons maintenant comment cela est géré et comment le moteur JavaScript le gère lorsque nous parlerons de la boucle d'événements. C'est aussi pourquoi il est important de comprendre les modèles JavaScript asynchrones en JavaScript. Et c'est l'une des parties critiques que nous aborderons dans ce cours. Maintenant, dans notre diagramme, comme vous pouvez le voir, nous avons un code très simple. Passons en revue la question avec le tas de mémoire et la pile d'appels illustrer comment ils sont utilisés pour parcourir le code. En gros, ce que nous faisons est déclarer deux variables, a et B. Ensuite, nous avons une fonction déclarée. Ensuite, nous invoquons cette fonction ici. À l'intérieur de la fonction, nous appelons le journal de la console. Nous appelons setTimeout et transmettons une fonction à SetTimeout. Le temps pour cela est de 0 milliseconde. Ensuite, nous appelons à nouveau le journal de la console. Passons donc à cette question. Nous avons d'abord les déclarations variables. Et donc chacun d'entre eux va être placé dans le tas de mémoire. Il reste 1 seconde. Maintenant, il n'y a pas d'ordre précis dans façon dont ils sont placés dans le tas. Ils ont juste besoin d'une référence à l'endroit où se trouve cette valeur. Ensuite, nous avons notre fonction. Et cela devra également être placé dans le tas. Et là, nous l'avons ajouté à la mémoire. Maintenant, s'il y avait des variables déclarées à l'intérieur de cette fonction, elles devraient y être placées. Ou s'il y a des fonctions déclarées à l'intérieur, s'il y a d'autres éléments à l'intérieur qui doivent être placés dans le tas de mémoire, cela devrait se produire. Mais maintenant, nous rencontrons. L'appel à helloworld pour cette fonction. Nous l'invoquons. Le moteur JavaScript récupère donc ce code à partir de son emplacement mémoire, puis il peut commencer à l'exécuter à aide de la pile d'appels. La fonction hello-world est donc placée sur la pile d'appels qui indique où nous en sommes dans l'exécution du code. Donc, en ce moment, nous sommes dans la fonction helloworld. Nous arrivons à la première commande, qui est un appel à console.log. Nous sommes donc placés dans le journal des points de la console d'invocation et celui-ci est placé sur la pile d'appels. Nous sommes maintenant en mesure de terminer cette commande. Ainsi, une fois cette commande terminée, elle est supprimée de la pile d'appels et nous pouvons continuer. Et nous arrivons à définir le délai et setTimeout est ajouté à la pile d'appels. Cependant, setTimeout fait partie de l'API Web, comme vous pouvez le voir ici. JavaScript n'a donc rien à faire avec ça. Donc, en gros, il s'en débarrasse. Il l'envoie au navigateur et dit : «  Ici, je dois appeler le SetTimeout. Voici les informations. Allez-y, occupez-vous de cela. Et puis, si le moteur JavaScript l'oublie à ce moment-là, l'API Web, nous allons configurer un timer pour ce setTimeout et il gérera tout ce qui doit être géré avec setTimeout. Mais à ce stade, le moteur JavaScript l' tout simplement oublié. Ça ne l' inquiète plus. Il passe simplement à la commande suivante, qui est un autre collègue, console.log. Et cela s'ajoute à notre pile d'appels. Nous sommes en mesure de nous en occuper immédiatement. Nous envoyons un message à la console, qui se trouve être le monde entier. Ensuite, cela est retiré de la pile d'appels. Et puis, à ce moment-là, nous sommes à la fin de la fonction Hello-World. Et cela est donc retiré de la pile d'appels. Maintenant, vous pouvez voir comment la pile d'appels pourrait être construite avec un certain nombre de choses. Si nous avions des fonctions appelées dans d'autres fonctions. Et plus nous avons des fonctions imbriquées de ce type, plus de choses seront ajoutées à la pile d'appels. Et nous allons développer cette pile d'appels. Parce que tant qu'une fonction ne revient pas, tant qu'elle n'est pas terminée, elle ne peut pas être supprimée de la pile d'appels Maintenant, avec toute cette illustration, j'ai laissé SetTimeout là-bas et j'ai dit que le moteur JavaScript l'avait oublié. Eh bien, nous en parlerons lorsque nous aborderons le sujet de la boucle d'événements, car en réalité, c'est la boucle d'événements et la file de messages qui s'occupent de cela, qui traitent de ces éléments de l'API Web. Nous en parlerons donc dans un autre sujet. Mais avant de passer au sujet suivant, je voudrais aborder un problème que nous pouvons rencontrer avec la pile d'appels, qui s' appelle Stack Overflow. Et c'est une condition que vous avez peut-être rencontrée lors de votre codage. Cela se produit lorsque la pile d' appels se remplit parce qu'elle ne peut pas supprimer commandes et que d'autres continuent à y être ajoutées. J'ai mentionné que les fonctions imbriquées pouvaient ajouter beaucoup à la pile d'appels. Eh bien, il faut un certain temps pour que la pile d'appels se remplisse. Mais lorsqu'il se remplit, cela provoque une erreur. Maintenant, nous pouvons simuler cela assez facilement avec un appel récursif. Maintenant, la récursivité se produit simplement lorsqu' une fonction s'appelle elle-même. Et dans certaines situations, il s'agit d'un modèle avantageux en JavaScript. Mais je veux vous montrer les effets de ce qu'il fait sur la pile. Alors allons-y et mettons en place une fonction qui illustrera cela. Ce fichier JavaScript est joint au fichier HTML. Celle-là que nous avons examinée précédemment. Je vais juste y ajouter une fonction et l'appeler self ramus. Voyez ce qui se passe. Alors, laissez-moi l'appeler récursivité. Il n'est pas nécessaire de l'appeler ainsi, mais je vais le faire parce que je vais l'appeler. Ensuite, je vais définir le nombre qui est transmis égal à lui-même et à lui-même, quelque chose de simple comme ça. Et puis c'est là que la récursivité se produit. Nous nous invoquons de l'intérieur. Alors réfléchissez à ce que cela va faire. La pile d'appels. Nous allons appeler la récursivité, placer la récursivité sur la pile d'appels va aller jusqu'à cette ligne. Et la récursivité va être appelée à nouveau, mais la fonction n'est pas terminée, elle n'est donc pas supprimée de la pile d'appels. Une autre invocation de celui-ci est ajoutée à la pile d'appels. Il continue donc à ajouter de la récursivité à la pile d'appels jusqu'à ce qu'elle s'accumule au point de ne plus pouvoir en ajouter. Et c'est là que nous obtenons ce dépassement de capacité. Permettez-moi d'invoquer cela. Je vais passer le numéro un. Nous allons enregistrer ça. Maintenant que je l'ai juste joint à ce fichier HTML, je vais juste le rafraîchir et voir ce qui se passe. Ouvrons la console et voyons ce que nous avons là. Nous avons un champ de tir non capté. Notre taille maximale de pile d'appels est dépassée. C'est l'air que nous recevrions. S'il y avait un débordement de pile. taille maximale de la pile d'appels a été dépassée, et c'est ce que nous obtenons. Maintenant, c'est un problème simple à résoudre. Tout ce que nous avons à faire est de nous assurer que les fonctions finissent par terminer, qu'elles reviennent. Ensuite, il peut les supprimer de la pile d'appels. Finalement, retirez-les tous de la pile d'appels du crâne. Voyons comment cela pourrait être fait. Disons que si le nombre est supérieur à et je vais juste mettre un grand nombre ici. Je ne sais pas quelle sera sa taille , mais si c'est plus que cela, je vais juste me connecter à la console. Je veux voir la taille du chiffre, juste pour le plaisir. Ensuite, je vais revenir. Voici donc où nous revenons de cette fonction. Il va donc compléter la fonction, nous revenons ici. Il ne recommencera pas. Et il complétera la fonction dans laquelle nous nous trouvons. Et ainsi, il dénouera la pile d'appels, chacune de ces fonctions. Nous allons enfin pouvoir revenir car cela arrivera à la fin de la fonction. Et donc le fait que la dernière fois que nous appelons cela, où le, où num est supérieur à cela, cela force un retour, n'en appelle pas un autre. Ainsi, tous les autres qui se trouvent dans la pile d'appels également être terminés. Ainsi, nous n'obtenons pas ce débordement de pile. Très bien, regardons ça encore une fois. Je vais me rafraîchir ici. Je veux me rappeler qu'il ne grossit pas si je ne le renvoie pas lorsque j'appelle cette fonction. Je veux donc m'assurer qu' il s'agrandit. On y va. Maintenant, nous en un très grand nombre recevons un très grand nombre et nous n'avons plus débordement de pile parce que nous avons pu revenir. Ensuite, débloquez tous les appels de fonction qui se trouvent dans la pile. C'est ce à quoi nous faisons référence lorsque nous parlons de StackOverflow. Très bien, passons au sujet suivant. 5. Comprendre la collecte des déchets: Dans la rubrique précédente, nous avons mentionné la collecte des déchets en relation avec le tas de mémoire. Dans un langage comme le C, nous devons allouer et libérer de la mémoire. Ne le faisons pas en JavaScript, mais il doit tout de même y avoir un mécanisme pour récupérer de la mémoire. Ainsi, nous ne manquons pas de mémoire et ne faisons pas planter le système. Javascript gère la récupération de la mémoire pour nous. Une fois qu'une information, un objet ou une variable, est hors contexte et ne sera plus utilisée. Sa mémoire est récupérée, elle peut donc être réutilisée. Cela s'appelle la collecte des ordures. Voyons comment cela fonctionne dans le moteur. La collecte des déchets a lieu dans le tas de mémoire et utilise ce que l' on appelle parfois un algorithme de marquage et de balayage. Il détermine les objets qui peuvent être supprimés en toute sécurité de la mémoire en déterminant quels objets sont accessibles et quels objets ne sont pas accessibles. Et puis il balaie ceux qui sont inaccessibles. Ils sont balayés et cette mémoire est récupérée. Voyons comment cela fonctionne. À présent, le ramasse-miettes commence par l'objet racine ou global et passe aux objets référencés par celui-ci. Et il passe d'un objet à l'autre, identifiant les objets référencés par quelque chose d'autre. Donc, fondamentalement, les choses qui sont accessibles, celles qui ne le sont pas sont maintenant définies. Et puis tout ce qui est inaccessible, nous voyons maintenant certaines choses qui ne sont pas liées ou qui ne sont pas accessibles. Tout ce qui est inaccessible est effacé. Il les traverse et les balaie. Ils sont partis. Cette mémoire peut maintenant être récupérée et utilisée pour autre chose. Maintenant, comme vous l'avez remarqué dans notre explication, pour que les informations soient libérées et récupérées, ne doivent pas être liées à tout ce qui se passe actuellement dans le programme et qui est inaccessible. Bien qu'il soit possible pour notre codage d'empêcher la récupération d'objets , même si nous ne les utilisons plus. C'est ce qu'on appelle une fuite de mémoire. Les fuites de mémoire sont des parties de la mémoire dont l'application avait besoin et qu' elle utilisait dans le passé et qui ne sont plus nécessaires, mais dont le stockage n'est pas encore renvoyé dans le pool de mémoire. Même si la collecte des ordures est gérée pour nous. Comme nous l'avons vu, nous devons toujours être prudents en matière de gestion de la mémoire. Les fuites de mémoire peuvent provoquer l'échec des programmes JavaScript en utilisant toute la mémoire disponible. Examinons quelques facteurs courants qui peuvent provoquer des fuites de mémoire. Tout d'abord, les variables globales. Si vous continuez à créer des variables globales, elles resteront présentes tout au long de l'exécution du programme, même si elles ne sont pas nécessaires. Si ces variables sont des objets profondément imbriqués, beaucoup de mémoire peut être gaspillée. Ne pas supprimer les écouteurs d'événements qui ne sont plus nécessaires. Comme exemple de la façon dont cette chose particulière peut se produire. Vous pouvez créer de nombreux auditeurs d'événements pour une page ou un emplacement en particulier. Et puis, lorsque l' utilisateur dépasse ce seuil, où ces auditeurs d'événements sont longs, il n'est plus nécessaire. En tant que programmeur, ne les supprimez pas. Ils sont toujours là. Ils occupent toujours de la mémoire, en particulier pour les objets auxquels ils sont liés. Donc, quelque chose dont il faut être conscient. Le troisième point, les intervalles de temps imprécis. Maintenant, l'intervalle défini en est un bon exemple. Et si vous n'avez pas utilisé l'intervalle défini, il vous permet essentiellement exécuter du code encore et encore en fonction d'un laps de temps défini. Maintenant, regardons un exemple très rapide de celui-ci. Je vais juste appeler Set Interval. Et set interval prend comme premier paramètre une fonction. Il s'agit d'une fonction de rappel. Ainsi, chaque fois que l' intervalle expire, le temps que nous y entrons invoque cette fonction de rappel. Je vais donc configurer une fonction ici. Ensuite, le deuxième paramètre est la durée en millisecondes pendant laquelle chaque intervalle se produit. Donc, toutes les 200 millisecondes, cette fonction sera invoquée, d'accord ? Maintenant, lorsque cela peut devenir un problème, disons à l'intérieur d'ici, nous référençons le nombre d'objets. Ces objets y sont, y sont référencés. Parfois, cela se fait avec de l'animation ou quelque chose comme ça. Mais si cela n'est jamais effacé, si cet intervalle défini ne l' est pas, il est évident que ces références seront toujours valides. Il ne pourra donc jamais libérer cette mémoire, même si elle n'est plus utilisée. Une meilleure approche du problème de l'intervalle défini consiste donc à déclarer un identifiant et nous le définissons comme étant égal à setInterval qui placera un identifiant à l'intérieur de celui-ci. Ensuite, lorsque nous aurons terminé, nous devrions nous assurer que l'intervalle est clair avec cet identifiant, quelque chose comme ça. D'accord, encore une chose que nous devons mentionner, c'est la suppression des éléments DOM. Si dans votre programme vous supprimez des éléments du DOM. Mais ces éléments sont toujours des références, par exemple dans le cas d'un écouteur d'événements. Nous en avons parlé plus tôt, ou d'une autre manière, la mémoire ne sera pas libérée. Autre chose dont il faut être conscient. Nous allons maintenant revenir sur certains de ces points et sur d'autres du cours afin vous rappeler les meilleures pratiques pour éviter les fuites de mémoire. Toutes ces choses dont nous avons parlé peuvent s'accumuler et les fuites de mémoire continueront d'occuper de plus en plus de mémoire. Si votre programme s'exécute assez longtemps, il risque d'échouer par manque de mémoire. Même s'il ne tombe pas, vous devez vous assurer d'éviter les fuites de mémoire et ne pas vous contenter de la collecte des ordures pour vous sauver la situation. Très bien, passons au sujet suivant. 6. Retirer les auditeurs d'événements pour vous aider à collecter les déchets: Dans ce deuxième sujet sur la collecte des déchets, je souhaite développer certaines des techniques spécifiques aux navigateurs mentionnées dans la rubrique précédente. Plus précisément, je vais expliquer comment supprimer les écouteurs d'événements et JavaScript. Tous les développeurs JavaScript ne sont pas familiers avec cette fonctionnalité, mais elle est essentielle lorsqu'on parle de collecte des déchets. J'ai donc voulu l'insérer ici. Maintenant, si vous codez pour le navigateur, vous travaillerez avec l'aube. Le DOM est l'abréviation de Document Object Model. Il s'agit simplement d'une interface qui permet à JavaScript de manipuler le contenu, la structure et le style du document HTML. Le document HTML est représenté l'aide de nœuds et d'objets afin que le programmeur puisse interfacer et travailler avec chaque élément de la page HTML. Il existe de nombreuses commandes pour travailler avec le DOM. Je les aborde en détail dans mon cours Getting Started et j'ai inclus certains de ces sujets dans l'annexe. Si vous avez besoin de revoir. J'ai inclus des informations sur le DOM et des commandes pour sélectionner et utiliser les éléments du DOM. Très bien, revenons maintenant au sujet en question. Si vous avez associé un écouteur d'événements à un objet ou à un élément DOM et que cet événement ne sera plus utilisé. Il est recommandé de supprimer l'écouteur. Jetons donc un coup d'œil à l'exemple. Jetons un coup d'œil au code HTML de cette page, que je suis en train de montrer. La voici, comme vous pouvez le voir, c'est une page HTML assez simple. Nous avons un titre dans le titre, nous avons du CSS. Ensuite, dans le corps, nous avons quelques balises div. Et ce que je veux faire, c'est joindre un écouteur d'événements à cette balise div qui a un identifiant de titre. Donc, si nous regardons notre code JavaScript, comme vous pouvez le voir, ce fichier app.js est joint à ce fichier HTML. Nous avons déclaré quelques variables ici. Maintenant, je le fais façon simpliste pour montrer un exemple ici. J'ai donc utilisé certaines variables globales parce que c'est si simple. , je ne prends pas le temps de le faire différemment. Je veux juste montrer cet exemple. Nous avons donc quelques variables globales ici. L'une est le compte et l'autre est une variable de titre qui stocke la division ayant un ID de titre. C'est ainsi que je le sélectionne ici. Nous allons donc y ajouter un écouteur d' événements. Donc je viens ici et je prends simplement cette variable là-bas, j'ajoute un écouteur d'événements. Et nous devons indiquer de quel événement il s'agit. Il s'agit d'un événement de clic que nous voulons utiliser. Et maintenant, quelle fonction va appeler That's title ? Cliquez sur cette fonction ici. Maintenant, vous pouvez parfois ajouter écouteurs d' événements avec des fonctions anonymes, où vous déclarez la fonction ici, au lieu de la déclarer avant de la déclarer dans l' écouteur d'événements d'ajout. Et c'est très bien. Mais vous devez être conscient que si vous faites cela, vous n'êtes pas en mesure de supprimer l'écouteur d'événements . Vous devrez peut-être le supprimer, alors vous devez le faire de cette façon. Très bien. J'en parlerai de la raison dans une minute, lorsque nous en serons là. Mais d'abord, assurons-nous que cela fonctionne. Je vais enregistrer ça. Le serveur virtuel fonctionne déjà sur cette page. Je vais donc juste le redimensionner. Et montrons la console afin que nous puissions voir le message du journal de la console lorsque je clique sur le titre. Et comme nous pouvons le voir, le compteur s' incrémente et indique tant de fois qu'il a été cliqué. Très bien, c'est très simple. Nous y avons ajouté l' EventListener. Voyons maintenant comment supprimer cet écouteur d'événements. Supposons donc que nous voulions le supprimer une fois que le nombre était supérieur à cinq. Nous allons donc le faire rapidement. Si déclaration. Si le nombre est supérieur à cinq. Eh bien, c'est une situation dans laquelle nous allons supprimer l'écouteur d'événements. Et voici la commande. Nous devons utiliser le même objet auquel l' écouteur d'événements est attaché. Dans ce cas, il s'agit d'un élément DOM. Donc, point de marée et puis la commande est remove event, listener, comme ça. Maintenant, cette partie entre parenthèses doit correspondre à ce que nous avions ici lorsque nous avons configuré l'EventListener. Et c'est pourquoi je dis que lorsque vous utilisez une fonction anonyme, vous ne pouvez pas la faire fonctionner. Vous devez déclarer la fonction au préalable. Donc, ces choses sont les mêmes. Et même si vous déclarez des options ou utilisez la capture, ou autre chose, lorsque vous configurez l'addEventListener, vous devez également les inclure ici afin de les supprimer. C'est l'une des exigences de cette commande remove event listener. Très bien, alors allons-y et sauvegardons ça. Cela va rafraîchir la page. Vous pouvez voir que ces messages ont disparu. Maintenant, si on commence à cliquer dessus, ça compte, on en aura six. Maintenant, il faut le supprimer. Maintenant, je clique dessus et rien ne se passe. Cet écouteur d'événements a été supprimé. Il s'agit donc essentiellement du processus de suppression d'un écouteur d'événements. Je voulais en parler ici parce que nous parlions de collecte des ordures. Très bien, passons à autre chose. 7. Comprendre la boucle d'événement: Avant de terminer parler du moteur JavaScript, nous devons parler de la boucle d'événements. Jusqu'à présent, nous avons établi que JavaScript est un thread unique. Il ne possède qu'une seule pile d'appels. Il ne peut faire qu'une seule chose à la fois, il est donc synchrone. Cependant, JavaScript nous permet de faire du codage asynchrone. d'un bouton à une page HTML en est un exemple simple ajout d'un bouton à une page HTML en est un exemple simple. Nous pouvons exécuter du JavaScript. L'utilisateur cliquera sur le bouton et nous pourrons répondre à ce clic. Parce que JavaScript est en cours d'exécution et fait autre chose. Cela n'empêche pas l'utilisateur de cliquer sur ce bouton. Ce serait bien sûr une expérience horrible sur un navigateur. Un autre exemple est que si nous essayons de récupérer des données d'une base de données, nous faisons cet appel à la base de données et nous pouvons ensuite faire autre chose en attendant que les données soient renvoyées. Nous n'avons pas à attendre ces données avant de faire autre chose. Et cela bloquerait les autres traitements JavaScript. Nous pouvons faire autre chose. Ensuite, lorsque les données sont renvoyées, nous pouvons agir en fonction de ces données. Nous pouvons réaliser ce codage asynchrone en JavaScript grâce à la boucle d'événements. Dans le scénario précédent, la commande SetTimeout était gérée par l'API Web. Et j'ai mentionné : « À ce moment-là, le moteur JavaScript oublie tout cela. Eh bien, une fois que cet événement de synchronisation est terminé, une fois que l'API Web se termine à l'événement de synchronisation, comment est-il réintégré dans la pile d'appels afin que la tâche que nous voulons terminer soit terminée ? Par exemple, si vous vous en souvenez, nous avons une fonction de rappel dans le cadre du setTimeout. Comment cette fonction de rappel renvoie-t-elle au moteur JavaScript ? Reprenons le scénario précédent, mais cette fois, nous allons inclure la boucle des événements. Encore une fois. Voici notre code, voici notre setTimeout. Et remarquez que nous avons une fonction ici. Toute la fonction contient une instruction de journal de console, c'est tout. Les millisecondes étant réglées sur 0, le temporisateur doit expirer immédiatement. Mais voyons ce qui se passe. Nous en sommes arrivés au point où la fonction hello-world est invoquée. Continuons donc à parcourir cela. Nous avons donc l'invocation de la fonction hello-world qui est ajoutée à la pile d'appels. Ensuite, il commence à utiliser les commandes de cette fonction. Ainsi, la première commande que nous rencontrons est une instruction de journal de console qui va enregistrer la variable a dans la console. Et cela s'ajoute à la pile d'appels. Il s'occupe de cette déclaration de journal. On voit Hello sur la console. Ensuite, la commande console log est supprimée de la pile d'appels. Et puis nous avançons dans cette fonction, nous rencontrons le setTimeout. Maintenant, le moteur JavaScript sait que setTimeout est géré par l'API Web, il est donc envoyé là-bas pour être traité. L'API Web configure donc un temporisateur. Il a la capacité de faire fonctionner une minuterie. Et ce délai expire immédiatement parce que nous n'avons pas réglé sur 0 milliseconde. Et donc, lorsque le temporisateur expire, que fait-il avec cette fonction de rappel ? C'est ce que le chronomètre est censé faire. Il ajoute donc la fonction de rappel à la file d'attente des messages. Maintenant, cette fonction de rappel se trouve dans la file d'attente des messages et c'est à ce moment que la boucle d'événements entre en jeu. La boucle d'événements continuera de fonctionner. Il vérifiera la pile d'appels et verra si elle est vide. heure actuelle. Il fonctionne toujours sur la fonction hello-world. Il n'est donc pas vide, mais à cycles et continue d'avoir l'air d'une scène. S'il est vide. S'il est vide, sera ajouté le prochain élément disponible dans la file de messages sera ajouté à la pile d'appels. Mais pour l'instant, il n'est pas vide, nous devons donc continuer avec la fonction hello-world. Quelle est la prochaine chose qui se présente ? Eh bien, il s'agit d'une autre instruction du journal de la console, qui est donc ajoutée à la pile d'appels. Et nous allons de l'avant et terminons que la déclaration du journal de la console World est imprimée sur la console. Ainsi, l'instruction du journal de la console est supprimée de la pile d'appels. À ce stade, nous en avons terminé avec la fonction hello-world qui est également supprimée de la pile d' appels. Donc, comme je l'ai mentionné, la boucle d'événements fait du cycle et vérifie la pile d'appels. Donc, au moment des contrôles et des visites, il est vide. Il saisit ensuite l'élément suivant dans la file de messages et l'ajoute à la pile d'appels. Ainsi, nous sortons cette fonction anonyme, cette fonction de rappel, de la pile d'appels et elle commence à fonctionner selon ce que cette fonction doit faire. La seule chose qu'il contient est une instruction du journal de la console. Il rencontre cette instruction du journal de la console et l'ajoute à la pile d'appels. L' instruction du journal de la console est terminée. Un point d'exclamation est imprimé sur la console qui est supprimée de la pile d'appels. C'est la fin de cette fonction, et cette fonction est également supprimée de la pile d'appels. Ainsi, à ce stade, la pile d'appels est vide, il n'y a plus rien à ajouter dans la file d'attente des messages. Nous attendons donc simplement un numéro, une autre commande JavaScript qui doit être exécutée. Bien, maintenant, avant de terminer, permettez-moi de souligner quelques points importants de cette discussion. abord, d'autres parties de l'environnement JavaScript peuvent gérer certaines tâches. Par exemple, les tâches qui appartiennent au navigateur. Le moteur JavaScript n'a pas à les traiter. Dans cet exemple, nous utilisons l'API Web pour gérer cette commande setTimeout. Mais les callbacks qui font partie de ce qui y est géré sont réintégrés dans le moteur à l'aide de la boucle d'événements. Il les extrait de la file d'attente des messages et les ajoute à la pile d'appels. Nous réalisons du JavaScript asynchrone de cette façon. La boucle d'événements est essentielle pour que cela se produise. Un autre point important, une fois qu' un rappel est ajouté à la pile d'appels, le code est géré par la pile d'appels comme il le serait normalement si le code JavaScript ne provenait pas du Q, n'est-ce pas peu importe. Il va traiter ce JavaScript de la même manière. Ensuite, pour rappel, la boucle d'événements vérifie en permanence la présence d' éléments dans la file d'attente. Et si la pile d'appels est vide, si la pile d'appels est vide et qu'il y a quelque chose dans la file d'attente, le prochain élément disponible de la file d'attente sera ajouté à la pile d'appels. Et comme mentionné, la pile d'appels est constituée d'un thread, elle est donc synchrone. Il ne peut faire qu'une seule chose à la fois, mais son interaction avec la boucle d'événements et l'API Web permet le codage asynchrone que nous pouvons réaliser en JavaScript. Très bien, passons au sujet suivant. 8. L'environnement d'exécution du nœud: Étant donné que NodeJS est une implémentation très largement utilisée de JavaScript, je pense qu'il est important d' examiner brièvement son environnement d'exécution, en particulier en ce qui concerne la boucle d'événements et la file d'attente de messages qui nous venons d'en parler. Cet article décrit certains des tenants et aboutissants de l'environnement Node.JS. Et voici l'URL de cet article. Vous pouvez le lire vous-même si vous le souhaitez. Mais je voulais prendre un moment pour regarder le schéma qu'il fournit de l'environnement d'exécution. Donc, si nous faisons défiler un peu vers le bas, juste ici, le nœud JS Runtime. Maintenant, vous allez reconnaître certaines de ces choses , par exemple, V8, voici le moteur V8 qui gère le JavaScript. C'est ce qu'il fait. Remarquez la file d'événements, dont le nom est différent mais similaire à la file de messages. La boucle d'événements en fait également partie. Afin de gérer les éléments de la file d'attente des événements. Cette partie ici en direct, vous pourriez être considérée comme similaire à l'API Web qui va gérer les choses que NodeJS doit faire. Cela n'est pas fait par JavaScript, c'est fait par l'environnement extérieur. Le moteur V8 est donc toujours à thread unique, possède toujours une pile d'appels, mais il peut tirer parti d'autres avantages. Et en exécutant sur un serveur, il y a un certain nombre de choses différentes qui doivent être effectuées et qui seront gérées ici. Maintenant, sachez que le SIG possède certaines commandes similaires à celles que nous voyons dans le navigateur. Par exemple, setTimeout, set interval, tous deux sont disponibles , tout comme NodeJS, ils ne sont pas gérés par le moteur V8, tout comme ils ne l'étaient ils ne sont pas gérés par le moteur V8, pas dans un navigateur. Ils sont gérés ici. Il y a donc quelques similitudes. Mais parce que c'est un environnement différent, parce que le temps d'exécution est différent. Cela a été traité de différentes manières, mais les concepts sont transférables. Donc, encore une fois, vous pouvez en savoir plus à ce sujet dans cet article si vous le souhaitez. Mais je voulais souligner la boucle d'événements et les similitudes entre NodeJS et l' environnement d'exécution géré dans un navigateur. Très bien, passons au sujet suivant. 9. Démarrage de l'exercice : explorer la boucle d'empilement d'appels et de boucle d'événements: J'ai donc voulu faire un petit exercice amusant cadre de cette section, afin d'explorer un peu la pile d'appels et la boucle d'événements. Maintenant, avec tous mes cours, je propose toujours des exercices parce que je pense qu'il est important pour vous de réellement faire les choses afin d' apprendre que les choses doivent se faire par vous-même à fois. donc là que les exercices entrent en jeu. Pour ce faire, j'ai une première vidéo présentant l'exercice. Et ensuite, allez-y et essayez. Ensuite, lorsque vous êtes prêt, vous passez au sujet suivant. Et nous procédons à cet exercice. C'est généralement la structure. Parfois, ils font les choses un peu différemment, mais c'est généralement la structure. Alors allons-y et voyons ce que j'aimerais que vous fassiez pour cet exercice. Très bien, les fichiers de l'exercice, et plus particulièrement le fichier JavaScript App.js. J'ai du code ici et laissez-moi l' expliquer très rapidement, puis je vous indiquerai ce que j'aimerais que vous fassiez. Donc, ici, nous créons un tableau, et nous créons un tableau de 10 000 éléments. Le numéro que j'ai utilisé dans le constructeur, le constructeur de tableau juste là. Ensuite, nous utilisons la méthode de remplissage des tableaux pour le remplir avec des uns. Et donc, en gros, il crée un tableau d' une longueur de 10 000 qui en contient un dans chacun d'eux. C'est ce que nous faisons ici. Ensuite, j'ai une petite fonction, je l'appelle « pop it ». Fondamentalement , il suffit de saisir une valeur chaque fois que la fonction est appelée à partir de ce tableau. Ensuite, nous l'invoquons. Et remarquez que nous avons de la récursivité ici car elle vérifie la longueur du tableau. Si la longueur est toujours supérieure à 0, ce qui signifie qu'il y a encore des éléments dans ce tableau, il s'appellera à nouveau, ce qui fera apparaître un autre élément. C'est de la récursivité que nous faisons. Et comme vous vous en souvenez, lorsque nous faisions de la récursivité auparavant, nous sommes capables de déborder la pile. Donc, j'aimerais que vous voyiez quel est le nombre requis pour provoquer un débordement de pile. Si 10 000 fonctionnent pour vous, alors tant mieux. Mais ce n'est peut-être pas le cas Il suffit donc de jouer avec ce nombre d'enchères , ce qui est plutôt amusant de voir ce qui va provoquer un débordement. Ensuite, la deuxième partie de l'exercice, une fois que vous avez débordé cette pile, comment pouvez-vous changer cela ? Comment pouvez-vous faire en sorte que cela utilise la boucle d'événements afin que la pile ne déborde pas ? donc une idée assez intéressante, de tirer parti de quelque chose qui est disponible dans l'environnement d'exécution ne pas déborder la pile, tout en pouvant toujours utiliser le même numéro C'est donc une idée assez intéressante, de tirer parti de quelque chose qui est disponible dans l'environnement d'exécution pour ne pas déborder la pile, tout en pouvant toujours utiliser le même numéro débordait la pile. Alors donne, essaie. De toute évidence, je ne vous ai pas enseigné de commandes spécifiques pour ce faire, bien que vous ayez vu quelques exemples lorsque nous avons examiné différents concepts dans cette section. Mais essayez-le avec ce que vous savez. Ensuite, lorsque vous serez prêt, passez au sujet suivant et nous l'examinerons. 10. Fin de l'exercice : explorer la boucle d'empilement d'appels et de l'événement: Très bien, jetons un coup d'œil à ce petit exercice amusant ici. Donc, en ce moment, 10 000, c' est le nombre qu'il y a dans ce tableau. Voyons si cela provoque un StackOverflow. Je vais donc y aller, servir ça et voir ce que nous obtenons. Je vais donc passer au fichier HTML , puis cliquer sur Go Live. Puis j'ai sauté sur la console. heure actuelle, nous ne voyons aucune erreur pour StackOverflow. Cela semble donc fonctionner correctement. en revenir à Visual Studio Code, je vais juste en réduire un peu la taille afin que nous puissions consulter le journal de la console pendant que nous jouons avec ce code. Passons donc à, allons-y, 10 500. Voyons ce qui se passe là-bas. Je vais donc changer ce numéro ici, le sauvegarder quand même. OK. Passons à 11 mille. Je vais le sauver. Et je n'ai toujours aucun problème. Alors peut-être que nous avons besoin de sauter plus haut. Allons-y encore 13 mille. OK, allons-y 15 000. Et là, il y a un trop-plein. Je ne sais donc pas quel est le chiffre exact, mais ce n'était pas vraiment ce que je voulais accomplir ici. Je voulais juste vous donner une chance de jouer avec ce stack overflow et de voir qu'à un moment donné, cela provoquera un dépassement de la taille de la pile. Ensuite, nous obtenons la portée non captée de l'air ici. Très bien, voilà l' air que nous recherchons. Maintenant. Comment pouvons-nous changer cela ? Nous pouvons donc toujours conserver ce numéro et l' exécuter de manière récursive et extraire tous ces éléments du tableau. Eh bien, afin de tirer parti de la boucle d'événements, nous pouvons utiliser l'API Web, nous pouvons utiliser setTimeout pour invoquer à nouveau cette fonction. OK ? Donc, au lieu de l' appeler récursif, récursivement tout de suite, nous pouvons utiliser setTimeout pour l'invoquer. Et donc, comme nous le ferions, setTimeout, puis nous transmettons la fonction. Maintenant, nous n'incluons pas les parenthèses à ce stade, car cela provoquera son invocation immédiate. Nous transmettons simplement la fonction et elle l' invoquera une fois le délai expiré. Nous allons donc mettre un 0 après cela pendant 0 millisecondes que nous voulons invoquer tout de suite. Voici donc notre nouvelle configuration. Allons-y, gardons ça et voyons ce qui se passe ici. Remarquez que nous ne prenons pas l'air. Allons-y et jetons un coup d'œil au tableau, voyons combien il en reste. Nous sommes descendus à 13 600. C'est donc le nombre de personnes qui sont apparues. Donc, évidemment, puisque nous utilisons la boucle d'événements, nous utilisons l' API Web avec setTimeout. Pour les faire sortir. Il faut plus de temps pour les supprimer toutes car il faut configurer cette minuterie. Ensuite, il met quelque chose dans une file d'attente. Ensuite, cet élément de la file d'attente est placé dans la pile d'appels, puis il est retiré. Et il le fait encore et encore. Alors regardons ça contre lui et nous l'avons réduit à oh, nous en avons perdu 67 000 ou 6 700 maintenant. Donc ça les traverse, mais c'est plutôt chouette. Vous pouvez le voir faire cela parce qu' il le fait beaucoup plus lentement. Mais remarquez qu'il ne bloque pas. Je peux saisir des informations ici sur la console et je ne suis pas empêché de faire d'autres choses en JavaScript. C'est donc l'avantage que la boucle d'événements fonctionne pour nous là-bas. Jetez un œil de plus, c'est presque terminé. Et au moment où j'appuie sur Retour, c'était fait. Il est donc maintenant nettoyé de cette matrice. Donc, juste un petit exercice amusant pour explorer la pile d'appels, une petite boucle d'événements. Très bien, passons au sujet suivant. 11. Comment JavaScript évolue: En tant que développeur JavaScript, il est important de comprendre comment JavaScript évolue et change. Parce que c'est quelque chose qui est certain dans le monde du JavaScript. Elle est en constante évolution. Lorsque j'ai commencé à utiliser JavaScript il y a de nombreuses années, il n'avait rien à voir avec le langage que nous avons aujourd'hui. On dirait presque que c'est une langue complètement différente. Nous pouvons en faire bien plus maintenant. Pour comprendre comment JavaScript évolue, nous devons parler de deux choses, script ekman et le TC 39. Parlons d'abord du script ECMO. Maintenant. Qu'est-ce qu'un script ? Je suis sûr que vous en avez entendu parler. Il est constamment utilisé, essentiellement comme une simple spécification utilisée par certains langages. Il est standardisé par l'ACM International, et c'est de là que vient son nom. Javascript est l'implémentation la plus utilisée dans mon script. C'est pourquoi il est si étroitement lié à JavaScript. Mais il existe d'autres langues dont vous avez probablement entendu parler. La chute de ce standard des scripts Ekman. Par exemple, Action Script, qui est le langage derrière Flash basé sur le standard de script Ekman et le script J créé par Microsoft. Cela est également basé sur cette spécification. Maintenant, la première édition du standard de scripts Ekman a été publiée en juin 1997, et elle a été appelée Ekman script one ou ES1. Et depuis lors, chaque version supplémentaire a été augmentée et ce nombre a été incrémenté. Donc ES x1, x2, x3, et ainsi de suite. Maintenant, quand Acme Script Sixth est sorti, ils ont commencé à désigner le bail avec l'année. À cette époque, la sortie était techniquement appelée Ackman script 2015 parce que c'est l'année Ekman script six est sorti. Cependant, ES6 vient de se bloquer. C'est pourquoi les gens l'appellent ES6 ou ECMO script 2015. Ils font des allers-retours entre cela, car les versions de l'ES6 sont bloquées. Cette version en particulier était une version énorme avec un certain nombre de fonctionnalités pour JavaScript. Si vous étiez dans le monde du JavaScript à cette époque, vous vous souviendrez du nombre de choses ont été ajoutées à JavaScript. Beaucoup de choses qui sont désormais régulièrement utilisées ont été ajoutées au cours de cette version particulière. Depuis la sortie de cette version du standard, une nouvelle version est publiée chaque année. Et nous avons donc eu le script d'Ekman, 2016201718192020. Chaque année, une nouvelle version sort. Cela vient en grande partie du fait que la sortie de Ekman Scripts Six était si énorme. Ils ne voulaient pas d'une autre sortie aussi importante à nouveau. Ils abordent donc la sortie d'une manière beaucoup plus gérable. Maintenant, qui détermine le contenu de chaque version ? D'où vient tout cela ? Eh bien, cela a à voir avec le TC3 Nine. Alors parlons-en. Maintenant. Tc 39 signifie comité technique 39. Et c'est un comité qui fait évoluer le JavaScript. Et ses membres sont des entreprises telles que des fournisseurs de navigateurs, qui s'intéressent directement au JavaScript. Le comité se réunit régulièrement et vous pouvez suivre ses procès-verbaux en ligne si vous le souhaitez. Donc, en ce sens, c'est transparent. Désormais, pour qu'une fonctionnalité parvienne à maturité et fasse partie d'une future version standard du script Ekman, elle doit passer par plusieurs étapes, que nous appelons étapes de maturité. Le comité TC3 dynein gère donc ces propositions à travers ces étapes jusqu'à ce qu'elles soient acceptées dans le cadre de la norme. Je veux donc parler de ces étapes très rapidement. Donc étape 1 ou étape 0, la première étape. Mais l'étape 0 est en fait l'étape de soumission. Et il s'agit simplement de la soumission d'une nouvelle fonctionnalité, d'une proposition de nouvelle fonctionnalité. Et cela doit provenir d'un membre du TC 39 ou d'une personne considérée comme un contributeur du TC 39. Et en gros, il s'agit d'un document décrivant la fonctionnalité qu'ils souhaitent. Cette étape 0. La première étape est l'étape de la proposition. Il s'agit maintenant d'une proposition officielle pour la fonctionnalité. Et cela doit avoir un champion qui sein de ce comité , souhaite que cette fonctionnalité soit adoptée. C'est donc la première étape. La deuxième étape est l'étape du projet. Et c'est vraiment la première version de ce qui figurera dans les spécifications pour cette fonctionnalité particulière. Une fois que quelque chose arrive au stade son inclusion éventuelle est beaucoup plus probable. troisième étape est désormais la phase candidate. À ce stade, la proposition est presque terminée et nécessite des commentaires de la part des implémentations et des utilisateurs. Et enfin, la quatrième étape est l'étape finale. À ce stade, il est prêt à être inclus dans la spécification et sera probablement inclus dans la prochaine spécification à venir. Mais ce n'est pas nécessairement une garantie. Tout au long de ces étapes, ces fonctionnalités sont toujours considérées comme des propositions et ne le sont pas tant qu'elles ne sont pas officiellement incluses dans la norme. Maintenant, il peut être important de connaître ces étapes. Par exemple, si vous accédez à un site comme celui-ci et que vous accédez à des fonctionnalités à venir, pouvez utiliser le bouton suivant pour découvrir ce qui est le bouton suivant pour compatible et ce qui ne l'est pas. Remarquez comment il est divisé en étapes dont nous venons de parler. Voici l'étape candidate, voici ce qui se présentera comme une possibilité dans la prochaine version du script d'Ekman. Et vous pouvez voir que certains navigateurs et certains compilateurs commencent déjà à prendre en charge ces fonctionnalités proposées. Vous pouvez le constater ici, au fur et à mesure que vous avancez dans les étapes de la deuxième ébauche, vous constatez que de moins en moins d'implémentations ont déjà été effectuées. Ainsi, puisque ces fournisseurs siègent au comité, ils savent ce qui va se passer. Ils sont peut-être les champions d'une proposition particulière, qui sait, mais ils commencent à mettre en œuvre certains de ces éléments avant ne fassent partie de la spécification officielle. Vous pouvez voir que nous pouvons même passer à l'étape 0, il ne s' y passe pas grand-chose du tout. Ainsi, lorsque des articles ou des sites comme celui-ci parlent de propositions, de propositions de scripts d' Ekman, ils parlent de choses qui en sont à l'une de ces étapes et qui n'ont pas été officiellement adoptées dans le standard encore, mais évoluent dans cette direction. C'est donc le processus suivi par tc Threonine afin de mettre à jour le standard de script Ackman pour JavaScript. Très bien, passons au sujet suivant.