recherche
Maisoninterface Webjs tutorielComment fonctionne JavaScript sous le capot ?

Cet article vise vraiment à expliquer de manière simple comment JavaScript fonctionne sous le capot afin que même un nouveau programmeur soit capable de saisir le concept et de visualiser ce qui se passe lors du codage de JavaScript.
Pour commencer, il y a au moins 3 questions sur lesquelles je voulais me concentrer et qui permettront de surmonter les difficultés et d'intérioriser la logique derrière ?
Ces questions sont également celles qui sont susceptibles d'être posées lors des entretiens d'embauche pour les développeurs Web où JavaScript implique :

1. Comment fonctionne JavaScript ?
2. Expliquez la différence entre synchrone et asynchrone ?
3. Ou expliquez cette affirmation : JavaScript est un langage à thread unique qui peut être non bloquant ?

Vraiment, Il n'est pas nécessaire de savoir comment fonctionne JavaScript en interne pour écrire un programme mais il est essentiel et crucial d'apprendre afin de comprendre ce qui se passe derrière et ressentir ce que vous écrivez d'où certains des nombreux développeurs qui ont de nombreuses années en transporteur, je m'en fiche de savoir ça.

Permet d'abord de savoir qu'est-ce qu'un programme ? Un programme est simplement un ensemble d'instructions qui indiquent à un ordinateur quoi faire et comment exécuter la tâche. Le programme doit allouer de la mémoire, sinon nous ne pourrons pas avoir de variables ni même sauvegarder des fichiers sur nos ordinateurs. Le programme doit également analyser (lire) et exécuter une tâche dédiée et tout se passe dans une mémoire.

Maintenant, JavaScript dispose d'un moteur connu sous le nom de Moteur JavaScript que chaque navigateur implémente. Par exemple dans Chrome, il s'appelle V8, dans Mozilla Firefox : Spider Monkey, dans le navigateur Safari : JavaScript Core Webkit.

L'image suivante montre le moteur V8 de Google Chrome
How JavaScript works underneath the hood?

Que se passe-t-il dans le moteur JavaScript ?

Le moteur JavaScript comme V8 dans Chrome lit les codes JavaScript que nous écrivons et les convertit en instructions exécutables par machine pour le navigateur. La figure ci-dessus montre des parties du moteur JavaScript qui se composent de deux parties, à savoir Un tas de mémoire **et **Une pile d'appels.

Il est également important de noter que l'allocation de mémoire s'effectue dans le tas de mémoire, tandis que l'analyse (lecture) et l'exécution ont lieu dans la Call Stack. En plus de cela, c'est le tas de mémoire qui vous indique où vous en êtes dans le programme.

Voyons l'allocation de mémoire dans le tas de mémoire avec les codes JS (JavaScript)

const a = 4;  // now we allocated a memory. JS engine is going to remember
// that a has a value of 4. 

const Obj = {a, b, c };  // In memory, variable 'Obj' holds the object {a, b,c}

// The same as on array. the engine will remember values of the array
const Array = [1,2,3,4,5]

Alors, quel est le problème avec le code ci-dessus une fois déclaré globalement ?

Il y a quelque chose appelé Fuite de mémoire. Comme mentionné ci-dessus, la déclaration de variable s'effectue dans le tas de mémoire et sa taille est limitée à allouer. Lorsque vous continuez à déclarer des variables globales qui sont de très grands tableaux au lieu de nombres et même inutilisées, cela remplit la mémoire et entraîne la Fuite de mémoire. Vous entendrez que les variables globales sont mauvaises car lorsque nous oublions de nettoyer, nous remplissons ce tas de mémoire et finalement le navigateur ne pourra pas fonctionner.

Qu'en est-il de la pile d'appels ?

Si on s'en souvient, c'est la Call Stack qui lit et exécute les scripts. Utilisons des codes pour que ce soit clair.

const a = 4;  // now we allocated a memory. JS engine is going to remember
// that a has a value of 4. 

const Obj = {a, b, c };  // In memory, variable 'Obj' holds the object {a, b,c}

// The same as on array. the engine will remember values of the array
const Array = [1,2,3,4,5]

Avec les codes ci-dessus, le call Sack lit la première ligne console.log("x"); et est placé dans la pile d'appels, le moteur JavaScript reconnaît que le console.log a été ajouté, puis l'insère dans la pile d'appels, l'exécute et génère x. Après, il supprime le premier console.log lorsqu'il a fini de l'exécuter et le place dans le deuxième console.log("y"), l'ajoute sur la pile d'appels, exécute y et supprime le deuxième console.log. Obtient enfin console.log("z") en utilisant le même processus.

C'est la démo la plus simple, et si c'était un exemple un peu plus complexe ? Donnons un exemple typique :

// Example Call Stak

console.log("x");
console.log("y");
console.log("z");

// Result in browser

// x
// y
// z

Maintenant, que s'est-il passé dans le code ci-dessus selon la pile d'appels ? Voyons comment il exécutera le bloc de code ci-dessus :

//PILE D'APPELS

La fonction example1() sera exécutée en premier, puis la fonction example2() vient au-dessus de la pile d'appels et est exécutée, ce qui imprime le numéro 7 en sortie après avoir vérifié s'il y a d'autres codes à exécuter. Après cela, il commencera à être supprimé de la pile d'appels dans l'ordre commençant par console.log('7'), example2(), example1() et la pile d'appels est maintenant vide.

> Est-ce qu'on se souvient de cette déclaration ? JavaScript est un langage à thread unique qui peut être non bloquant.

Un seul thread signifie qu'il n'a qu'une seule pile d'appels. Il ne peut effectuer qu'une seule chose à la fois et il est important de souligner que la La pile d'appels est premier entré, dernier sorti comme une pile.

D'autres langages peuvent avoir de nombreuses piles d'appels, ce qu'on appelle multi-thread, ce qui pourrait être plus avantageux d'avoir plusieurs piles d'appels afin de ne pas attendre les tâches.

> Mais pourquoi JavaScript a-t-il été conçu pour être à thread unique ?

Pour répondre à cette question, exécuter normalement du code sur un seul thread peut être assez simple puisqu'il n'y a pas de scénarios compliqués qui se produisent dans un environnement multithread. En fait, vous avez une chose à laquelle vous soucier. En multithread, il peut y avoir des problèmes tels que des Deadlocks. Avec cette théorie, on peut facilement savoir ce que signifie une Programmation synchrone.

La programmation synchrone signifie simplement : la première ligne de code est exécutée, la deuxième suit et la troisième est exécutée etc…

Pour être plus explicite, cela signifie que console.log(“y”) ne peut pas s'exécuter tant que console.log(“x”) n'est pas terminé et console.log (« z ») ne démarre pas avant la fin des deux premiers car il s'agit d'une Call Stack.

Il est probable que les programmeurs utilisent le site stackoverflow.com. que signifie le nom ? Bien. voyons :

How JavaScript works underneath the hood?
Comment se produit le débordement de pile

L'image ci-dessus montre comment une fuite de mémoire peut se produire et comment la mémoire d'un moteur JavaScript peut déborder. Ici, la pile d'appels reçoit de nombreuses entrées supérieures à sa taille et déborde.

Il est possible de démontrer le débordement de pile à l'aide du code :

const a = 4;  // now we allocated a memory. JS engine is going to remember
// that a has a value of 4. 

const Obj = {a, b, c };  // In memory, variable 'Obj' holds the object {a, b,c}

// The same as on array. the engine will remember values of the array
const Array = [1,2,3,4,5]

N'oubliez pas que JavaScript est un thread unique, une seule instruction est exécutée à la fois. Voici un problème maintenant : et si console.log(“y”) dans le bloc de code suivant a une grosse tâche qui prendra plus de temps à être exécuté par exemple en parcourant un tableau contenant des milliers ou des millions d'éléments ? que se passerait-il là-bas ?

// Example Call Stak

console.log("x");
console.log("y");
console.log("z");

// Result in browser

// x
// y
// z

La première ligne s'exécutera et supposera que la deuxième ligne a un travail énorme à effectuer, donc la troisième ligne attendra une longue période pour être exécutée. Dans l’exemple ci-dessus, cela ne veut pas dire grand-chose, mais pensons à un gros site Web qui effectue des opérations lourdes, l’utilisateur ne pourrait rien faire. Le site Web se bloquera jusqu'à ce que la tâche soit terminée et que l'utilisateur y attende. C'est une mauvaise expérience en ce qui concerne la performance.

Eh bien, avec les tâches synchrones, si nous avons une fonction qui prend beaucoup de temps, elle va retarder la file. Il semble donc que nous ayons besoin de quelque chose de non bloquant. Rappelez-vous la déclaration que j'ai mentionnée ci-dessus : JavaScript est un langage à thread unique qui peut être non bloquant.

Idéalement, en JavaScript, nous n'attendons pas les choses qui prennent du temps. Alors, comment contourner ce problème ?

En guise de secours, il existe la Programmation asynchrone. Alors, qu'est-ce que c'est ?

Pensez à l'asynchrone comme à un comportement. L'exécution synchrone est excellente car elle est prévisible. En synchrone, nous savons ce qui se passe en premier, ce qui se passe ensuite, etc., mais cela peut devenir lent.

Lorsque nous devons faire des choses comme le traitement d'images ou faire des requêtes sur le réseau comme des appels API, nous utilisons quelque chose de plus que de simples tâches synchrones qui sont asynchrones.

Voyons comment faire de la programmation asynchrone avec des codes :

const a = 4;  // now we allocated a memory. JS engine is going to remember
// that a has a value of 4. 

const Obj = {a, b, c };  // In memory, variable 'Obj' holds the object {a, b,c}

// The same as on array. the engine will remember values of the array
const Array = [1,2,3,4,5]

Maintenant, sur la base des codes ci-dessus, il semble que nous ayons sauté la deuxième ligne, exécuté la troisième et attendu 3 secondes pour afficher le résultat. c'est un événement asynchrone.

Afin de comprendre cela et ce qui s’est passé, utilisons la figure suivante.

How JavaScript works underneath the hood?
Environnement d'exécution JavaScript

Pour que JavaScript s'exécute, nous avons besoin de plus que du tas de mémoire et de la pile d'appels. nous avons besoin de ce qu'on appelle JavaScript Run-Time qui fait partie du navigateur. il est inclus dans les navigateurs. Au-dessus du moteur, il y a quelque chose appelé API Web, file d'attente de rappel et boucle d'événements comme indiqué sur la figure.

Discutons maintenant du code dans lequel nous utilisons la fonction setTimeout.

// Example Call Stak

console.log("x");
console.log("y");
console.log("z");

// Result in browser

// x
// y
// z

La fonction setTimeout fait partie de l'API Web et ne fait pas partie de JavaScript, c'est plutôt ce que les navigateurs nous donnent à utiliser pour nous permettre de faire de la programmation asynchrone. alors, fournissons plus de détails pour clarifier.

PILE D'APPELS : Le console.log("x") va dans la pile d'appels, s'exécute et nous console.log dans le navigateur. Après cela, setTimeout(() =>{console.log("y");},3000); va dans la pile d'appels car la première tâche est terminée puis passez à la seconde.

Maintenant, voici un truc, en lisant le code, la pile d'appels détectera qu'il y a une fonction setTimeout qui a été définie et qui ne fait pas partie de JavaScript mais de l'API web ( Voir la figure JavaScript Run-Time Environment ) et possède des caractéristiques particulières. Ce qui se passe, c'est que setTimeout déclenche l'API WEB et comme l'API Web est notifiée, la fonction sera retirée de la pile d'appels.

Maintenant, l'API web démarre un chronomètre de trois secondes sachant qu'en 3 secondes elle doit effectuer la tâche. N'oubliez pas ici, car la pile d'appels est vide, le moteur JavaScript continue jusqu'à la ligne 3 qui est console.log("z"); et exécutez-le. C'est pourquoi nous avons obtenu le résultat x,z mais nous avons setTimeout trois secondes dans l'API Web. puis, après trois secondes, lorsque le délai est écoulé, setTimeout s'exécute et voit ce qu'il contient et c'est fait. Une fois que c'est fait, l'API Web reconnaîtra qu'elle dispose d'une fonction callback() de setTimeout et l'ajoutera à la QUEUE DE RAPPEL étant prête à l'exécuter.

Nous arrivons à la dernière partie qui est** EVENT LOOP*. Celui-ci vérifie en permanence si la pile d’appels est vide. Lorsqu'il est vide et que rien n'est en cours d'exécution dans le moteur JavaScript, il vérifiera la file d'attente de rappel et trouvera notre fonction **callback()* avec console.log("z") puis placez-le dans CALL STACK et s'exécute. Une fois que c'est fait, sortez-le de la pile d'appels. Maintenant, tout est vide et obtenez le résultat x z y.

Conclusion : Dans cet article, nous avons vu de nombreuses informations sur ce qui se passe sous le capot pour comprendre complètement la logique JavaScript, les tâches exécutées de manière synchrone et asynchrone.

J'espère que cela aidera les programmeurs JavaScript nouveaux et avancés à apprécier le codage dans des frameworks liés à JavaScript comme ReactJS ou AngularJS, car c'est la base sur laquelle commencer pour comprendre la logique avancée.

> Bon codage

Références

https://www.freecodecamp.org/news/how-javascript-works-behind-the-scenes.
https://www.simplilearn.com/tutorials/javascript-tutorial/callback-function-in-javascript#

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Rôle de JavaScript: rendre le Web interactif et dynamiqueRôle de JavaScript: rendre le Web interactif et dynamiqueApr 24, 2025 am 12:12 AM

JavaScript est au cœur des sites Web modernes car il améliore l'interactivité et la dynamicité des pages Web. 1) Il permet de modifier le contenu sans rafraîchir la page, 2) manipuler les pages Web via Domapi, 3) prendre en charge les effets interactifs complexes tels que l'animation et le glisser-déposer, 4) Optimiser les performances et les meilleures pratiques pour améliorer l'expérience utilisateur.

C et JavaScript: la connexion expliquéeC et JavaScript: la connexion expliquéeApr 23, 2025 am 12:07 AM

C et JavaScript réalisent l'interopérabilité via WebAssembly. 1) Le code C est compilé dans le module WebAssembly et introduit dans un environnement JavaScript pour améliorer la puissance de calcul. 2) Dans le développement de jeux, C gère les moteurs de physique et le rendu graphique, et JavaScript est responsable de la logique du jeu et de l'interface utilisateur.

Des sites Web aux applications: les diverses applications de JavaScriptDes sites Web aux applications: les diverses applications de JavaScriptApr 22, 2025 am 12:02 AM

JavaScript est largement utilisé dans les sites Web, les applications mobiles, les applications de bureau et la programmation côté serveur. 1) Dans le développement de sites Web, JavaScript exploite DOM avec HTML et CSS pour réaliser des effets dynamiques et prend en charge des cadres tels que JQuery et React. 2) Grâce à la réactnative et ionique, JavaScript est utilisé pour développer des applications mobiles multiplateformes. 3) Le cadre électronique permet à JavaScript de créer des applications de bureau. 4) Node.js permet à JavaScript d'exécuter le côté du serveur et prend en charge les demandes simultanées élevées.

Python vs JavaScript: cas d'utilisation et applications comparéesPython vs JavaScript: cas d'utilisation et applications comparéesApr 21, 2025 am 12:01 AM

Python est plus adapté à la science et à l'automatisation des données, tandis que JavaScript est plus adapté au développement frontal et complet. 1. Python fonctionne bien dans la science des données et l'apprentissage automatique, en utilisant des bibliothèques telles que Numpy et Pandas pour le traitement et la modélisation des données. 2. Python est concis et efficace dans l'automatisation et les scripts. 3. JavaScript est indispensable dans le développement frontal et est utilisé pour créer des pages Web dynamiques et des applications à une seule page. 4. JavaScript joue un rôle dans le développement back-end via Node.js et prend en charge le développement complet de la pile.

Le rôle de C / C dans les interprètes et compilateurs JavaScriptLe rôle de C / C dans les interprètes et compilateurs JavaScriptApr 20, 2025 am 12:01 AM

C et C jouent un rôle essentiel dans le moteur JavaScript, principalement utilisé pour implémenter des interprètes et des compilateurs JIT. 1) C est utilisé pour analyser le code source JavaScript et générer une arborescence de syntaxe abstraite. 2) C est responsable de la génération et de l'exécution de bytecode. 3) C met en œuvre le compilateur JIT, optimise et compile le code de point chaud à l'exécution et améliore considérablement l'efficacité d'exécution de JavaScript.

JavaScript en action: Exemples et projets du monde réelJavaScript en action: Exemples et projets du monde réelApr 19, 2025 am 12:13 AM

L'application de JavaScript dans le monde réel comprend un développement frontal et back-end. 1) Afficher les applications frontales en créant une application de liste TODO, impliquant les opérations DOM et le traitement des événements. 2) Construisez RestulAPI via Node.js et Express pour démontrer les applications back-end.

Javascript et le web: fonctionnalité de base et cas d'utilisationJavascript et le web: fonctionnalité de base et cas d'utilisationApr 18, 2025 am 12:19 AM

Les principales utilisations de JavaScript dans le développement Web incluent l'interaction client, la vérification du formulaire et la communication asynchrone. 1) Mise à jour du contenu dynamique et interaction utilisateur via les opérations DOM; 2) La vérification du client est effectuée avant que l'utilisateur ne soumette les données pour améliorer l'expérience utilisateur; 3) La communication de rafraîchissement avec le serveur est réalisée via la technologie AJAX.

Comprendre le moteur JavaScript: détails de l'implémentationComprendre le moteur JavaScript: détails de l'implémentationApr 17, 2025 am 12:05 AM

Comprendre le fonctionnement du moteur JavaScript en interne est important pour les développeurs car il aide à écrire du code plus efficace et à comprendre les goulots d'étranglement des performances et les stratégies d'optimisation. 1) Le flux de travail du moteur comprend trois étapes: analyse, compilation et exécution; 2) Pendant le processus d'exécution, le moteur effectuera une optimisation dynamique, comme le cache en ligne et les classes cachées; 3) Les meilleures pratiques comprennent l'évitement des variables globales, l'optimisation des boucles, l'utilisation de const et de locations et d'éviter une utilisation excessive des fermetures.

See all articles

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Version crackée d'EditPlus en chinois

Version crackée d'EditPlus en chinois

Petite taille, coloration syntaxique, ne prend pas en charge la fonction d'invite de code

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Dreamweaver Mac

Dreamweaver Mac

Outils de développement Web visuel

MinGW - GNU minimaliste pour Windows

MinGW - GNU minimaliste pour Windows

Ce projet est en cours de migration vers osdn.net/projects/mingw, vous pouvez continuer à nous suivre là-bas. MinGW : un port Windows natif de GNU Compiler Collection (GCC), des bibliothèques d'importation et des fichiers d'en-tête librement distribuables pour la création d'applications Windows natives ; inclut des extensions du runtime MSVC pour prendre en charge la fonctionnalité C99. Tous les logiciels MinGW peuvent fonctionner sur les plates-formes Windows 64 bits.