web-dev-qa-db-fra.com

Pourquoi JavaScript hisse-t-il les variables?

Pourquoi JavaScript hisse-t-il les variables?

Quelle était la justification des concepteurs lorsqu'ils ont décidé de mettre en œuvre le levage? Y a-t-il d'autres langues populaires qui font cela?

Veuillez fournir des liens pertinents vers la documentation et/ou les enregistrements.

82
Xlaudius

Comme l'explique Stoyan Stefanov dans le livre "JavaScript Patterns", le hissage est le résultat de l'implémentation de l'interpréteur JavaScript.

L'interprétation du code JS a été réalisée en deux passes. Lors de la première passe, l'interpréteur traite les déclarations de variables et de fonctions.

La deuxième passe est l'étape d'exécution du code réel. L'interpréteur traite les expressions de fonction et les variables non déclarées.

Ainsi, nous pouvons utiliser le concept de "levage" pour décrire un tel comportement.

53
lxgreen

Le créateur de JS Brendan Eich ne fois dit (sur Twitter) :

"Le levage var était donc [une] conséquence involontaire du levage de fonction, pas de portée de bloc, [et] JS en tant que tâche Rush 1995."

Il a également expliqué que…

"La fonction de levage permet la décomposition descendante du programme, 'let rec' gratuitement, appelez avant de déclarer; var hoisting tagged along."

Brendan Eich

Y a-t-il d'autres langues populaires qui font cela?

Je ne connais aucun autre langage populaire qui hisse les variables de la même manière. Je pense que même ActionScript - une autre implémentation d'ECMAScript utilisée dans le développement Flash - n'a pas implémenté le hissage. Cela a été une source de confusion et de frustration pour les développeurs familiers avec d'autres langues qui apprennent JavaScript.

5
gfullam

C'est parce que l'interpréteur javascript interprète le code en deux cycles.

  1. Achèvement/compilation du code:
  2. Exécution de code:

Au 1er cycle, toutes les déclarations de variables et de fonctions sont prises en haut de l'étendue de la fonction dans laquelle elles s'exécutent. Cela aide à créer variableObjects pour execution context de la fonction avant même son exécution.

Dans la deuxième phase, les affectations de valeurs, les instructions de code et les appels de fonction ont lieu ligne par ligne de la manière attendue.

Vous avez une lecture un peu plus détaillée ici.

Il vous donnera une meilleure image du comportement autour des déclarations let, const et class, ainsi que la priorité qu'il suit entre les variables et les fonctions.

3
Jaspreet Singh