Fermer

août 2, 2020

Comment déclarer, interagir et étendre des variables en JavaScript


Les variables sont l'un des blocs fondamentaux de tout langage de programmation, la façon dont chaque langage définit comment nous déclarons et interagissons avec les variables peut faire ou défaire un langage de programmation. Cela signifie que chaque développeur doit être capable de comprendre comment travailler efficacement avec les variables, leurs règles et leurs particularités. Dans le didacticiel d'aujourd'hui, nous allons apprendre à déclarer, interagir et définir des variables dans JavaScript. Nous présenterons de nouveaux concepts et des mots clés JavaScript importants tels que var let and const . Alors, commençons.

Déclaration de variables

De nos jours, JavaScript a trois mots clés différents pour déclarer une variable – var let and , const . Chacun a ses propres propriétés et particularités. Commençons par faire un simple tableau de comparaison des trois mots clés, puis plongeons dans les détails.

Ne vous inquiétez pas si, pour le moment, vous n'êtes pas tout à fait sûr de ce que nous entendons par portée, levage ou l'un des autres attributs. Nous allons les couvrir en détail ensuite.

Portée de la variable

La ​​portée en JavaScript fait référence au contexte (ou à une partie) du code qui détermine l'accessibilité (visibilité) des variables. En JavaScript, nous avons deux types de portées, local et global . Bien que la portée locale puisse avoir des significations différentes.

Explorons les définitions en donnant quelques exemples de la façon dont la portée fonctionne. Supposons que vous définissiez une variable message :

Comme vous pouvez vous y attendre, la variable message utilisée dans le [19659002] console.log existerait et aurait la valeur Hello World . Aucun doute là-bas, mais que se passe-t-il si nous changeons un peu l'endroit où nous déclarons la variable:

Oups, on dirait que nous l'avons cassée, mais pourquoi? Eh bien, l'instruction if crée une portée de bloc local, et comme nous avons utilisé 'const', la variable n'est déclarée que pour cette portée de bloc, et n'est pas accessible de l'extérieur.

Parlons un peu plus à propos des portées de bloc et de fonction.

Portée de bloc

Un bloc est essentiellement une section de code (zéro ou plusieurs instructions) qui est délimitée par une paire d'accolades et peut éventuellement être étiquetée.

Comme nous l'avons déjà mentionné l'utilisation de let et const nous permet de définir des variables qui vivent dans la portée du bloc. Ensuite, nous allons créer des exemples très similaires en utilisant différents mots clés pour générer de nouvelles portées:

Expliquons celui-ci car il peut sembler un peu étrange au début. Dans notre champ extérieur, nous définissions la variable x1 avec une valeur de 1 . Ensuite, nous avons créé une nouvelle portée de bloc en utilisant simplement des accolades, c'est étrange, mais totalement légal dans JavaScript, et dans cette nouvelle portée, nous avons créé une nouvelle variable (distincte de celle de la portée externe) également nommée x1 . Mais ne vous y trompez pas, il s'agit d'une toute nouvelle variable, qui ne sera disponible que dans cette étendue.

Même exemple maintenant avec une portée nommée:

The «while», mais n'exécutez pas ce code ci-dessous. Je vous expliquerai pourquoi bientôt.

Pouvez-vous deviner ce qui ne va pas avec le code ci-dessus? Et que se passerait-il si vous l'exécutiez? Permettez-moi d'expliquer, x3 comme déclaré dans la portée externe est utilisé pour la comparaison while x3 === 1 normalement à l'intérieur de l'instruction while, je pourrais réaffecter x3 une nouvelle valeur et quittez la boucle. Cependant, comme nous déclarons un nouveau x3 dans la portée du bloc, nous ne pouvons plus changer x3 de la portée extérieure, et donc la condition «while» sera toujours évaluée à true produisant une boucle infinie qui bloquera votre navigateur, ou si vous utilisez un terminal pour l'exécuter sur NodeJS, vous imprimerez beaucoup de 2 .

La correction de ce code particulier pourrait être délicate à moins que vous ne renommez l'une ou l'autre des variables.

Jusqu'à présent, dans notre exemple, nous avons utilisé const mais exactement le même comportement se produirait avec let . Cependant, comme nous l'avons vu dans notre tableau de comparaison, le mot-clé var est en fait la portée de la fonction, alors qu'est-ce que cela signifie pour nos exemples? Eh bien, jetons un œil:

Incroyable! Même si nous avons de nouveau déclaré x4 à l'intérieur du scope, il a changé la valeur en 2 sur le scope interne ainsi que sur le scope externe. Et c'est l'une des différences les plus importantes entre let const et var et est généralement sujet (d'une manière ou d'une autre) pour les questions d'entrevue. [19659032] Portée de fonction

Une portée de fonction est en quelque sorte également une portée de bloc, donc let et const se comporteraient de la même manière que dans nos exemples précédents. Cependant, les portées de fonction encapsulent également des variables déclarées avec var . Mais voyons cela en continuant avec nos exemples xn :

const ou let exemple:

[19659015] Exactement comme nous l'attendions, et maintenant avec var:

Dans ce scénario, 'var' fonctionnait de la même manière que let et const . Aussi:

Comme nous pouvons le voir, les déclarations var n'existent que dans la fonction dans laquelle elles ont été créées et ne sont pas accessibles de l'extérieur. Mais il y a plus, comme toujours JS a évolué, et de nouveaux types de portées ont été créés.

Portée du module

Avec l'introduction des modules dans ES6, il était important que les variables d'un module n'affectent pas directement variables dans d'autres modules. Pouvez-vous imaginer un monde où l'importation de modules à partir d'une bibliothèque entrerait en conflit avec vos variables? Même JS n'est pas si compliqué. Ainsi, par définition, les modules créent leur propre portée qui encapsule toutes les variables créées avec var let ou const similaire à la portée de la fonction.

Il existe les moyens que les modules fournissent pour exporter des variables afin qu'elles soient accessibles de l'extérieur du module, et que j'ai déjà abordé dans un article précédent: An Intro To JavaScript Modules .

Jusqu'à présent, nous avons parlé de différents types des portées locales, plongeons maintenant dans les globalscopes.

Portée globale

Une variable définie en dehors de toute fonction, bloc ou module a une portée globale. Les variables de portée globale sont accessibles de partout dans l'application.

La portée globale peut parfois être confondue avec la portée du module, mais ce n'est pas le cas. Une variable de portée globale peut être utilisée dans tous les modules, bien que cela soit considéré comme une mauvaise pratique, et pour de bonnes raisons.

Comment déclareriez-vous une variable globale? Cela dépend du contexte, c'est différent sur un navigateur d'une application NodeJS. Dans le contexte du navigateur, vous pouvez faire quelque chose d'aussi simple que:

Ou en utilisant l'objet window:

Il y a quelques raisons pour lesquelles vous voulez faire quelque chose comme ça Cependant, soyez toujours prudent lorsque vous le faites.

Scopes d'imbrication

Comme vous l'avez probablement deviné maintenant, il est possible d'imbriquer des scopes, ce qui signifie que vous pouvez créer un scope dans un autre scope, et c'est une pratique très courante. Ajoutez simplement une instruction if à l'intérieur d'une fonction. Voyons donc un exemple:

Portée lexicale

D'une certaine manière, nous utilisions déjà la portée lexicale, même si nous n'en savions pas grand-chose. La portée lexicale signifie simplement que les autres portées ont accès aux variables définies dans les portées externes.

Voyons cela avec un exemple:

Cela semble plus étrange que ce que c'est, alors expliquons-le. La fonction externalScope déclare une variable nom avec la valeur Juan et une fonction nommée innerScope . Ce dernier ne déclare aucune variable pour sa propre portée mais utilise la variable name déclarée dans la portée de la fonction externe.

Lorsque outerScope () est appelé, il renvoie une référence à la fonction innerScope qui est appelée ultérieurement depuis la portée la plus externe. Lorsque vous lisez ce code pour la première fois, vous ne savez peut-être pas pourquoi innerScope console.log la valeur Juan comme nous l'appelons du global scope, ou module scope, où name n'est pas déclaré.

La raison pour laquelle cela fonctionne est grâce aux fermetures JavaScript. Les fermetures sont un sujet en soi et vous pouvez en savoir plus à ce sujet sur la documentation MDN .

Levage

Le levage en JavaScript signifie qu'une variable est créée en mémoire pendant la phase de compilation, et ils peuvent donc être utilisés avant d’être déclarés. Cela semble super déroutant, voyons mieux cela dans le code.

Voici à quoi ressemblerait un flux normal:

Comme prévu, cela fonctionne, mais que pensez-vous de ce qui suit:

Wait wait wait…. quoi? Aussi fou que cela puisse paraître, puisque la fonction est assignée à la mémoire avant que le code ne s'exécute réellement, la fonction hoistedDisplayName est disponible avant sa définition réelle, au moins en termes de lignes de code.

Les fonctions ont ce particulier propriété, mais aussi faire des variables déclarées avec var . Voyons un exemple:

Le fait que la variable soit "créée" avant sa définition réelle dans le code ne signifie pas que sa valeur est déjà affectée, c'est pourquoi lorsque nous faites le console.log (x8) nous n'obtenons pas d'erreur indiquant que la variable n'est pas déclarée, mais plutôt la variable a la valeur undefined . Très intéressant, mais que se passe-t-il si nous utilisons let ou const ? Souvenez-vous que dans notre tableau, ils ne partagent pas cette propriété.

Cela a généré une erreur.

Le levage est une propriété moins connue des variables JavaScript, mais c'est aussi une question importante. Assurez-vous de bien comprendre les différences, c'est important pour votre code, et cela peut être un sujet pour une question d'entrevue.

Réaffectation des variables

Cette rubrique couvre spécifiquement les variables déclarées avec le mot-clé const . Une variable déclarée avec const ne peut pas être réaffectée, ce qui signifie que nous ne pouvons pas changer sa valeur pour une nouvelle, mais il y a une astuce. Voyons quelques exemples:

Comme nous nous y attendions, nous ne pouvons pas changer la valeur d'une constante, ou pouvons-nous?

Avons-nous simplement changé la valeur d'un valeur const ? La réponse courte est non. Notre constante c2 fait référence à un objet avec une propriété name . c2 est une référence à cet objet, c'est sa valeur. Quand nous faisons c2.name nous prenons vraiment le pointeur vers l'objet c2 et accédons à la propriété à partir de là. Ce que nous changeons lorsque nous faisons c2.name est la valeur de la propriété name dans l'objet, mais pas la référence stocké dans c2 et donc c2 est resté constant bien que la valeur de la propriété soit maintenant différente.

Voyez ce qui se passe lorsque nous essayons réellement de mettre à jour la valeur différemment:

Même si l'objet se ressemble, nous créons en fait un nouvel objet {name: 'Gera'} [19659004] et en essayant d'attribuer ce nouvel objet à c3 mais nous ne pouvons pas car il a été déclaré comme constant.

Aujourd'hui, j'ai couvert le sujet des déclarations de variables et de la portée en JavaScript . C’est un sujet très important qui peut expliquer de nombreuses situations étranges dans notre code. C'est une compétence incontournable pour tous les développeurs JavaScript.

Cet article a été initialement publié le Live Code Stream par Juan Cruz Martinez ] (twitter: @bajcmartinez ), fondateur et éditeur de Live Code Stream, entrepreneur, développeur, auteur, orateur et faiseur de choses.

Live Code Stream est également disponible sous forme de bulletin hebdomadaire gratuit. Inscrivez-vous pour recevoir des mises à jour sur tout ce qui concerne la programmation, l'intelligence artificielle et l'informatique en général.

Pssst, hey you!

Voulez-vous recevoir GRATUITEMENT le bulletin technique quotidien le plus impertinent, dans votre boîte de réception? Bien sûr que vous faites: inscrivez-vous à Big Spam ici .




Source link