Fermer

mars 30, 2021

La portée de ceci et les fonctions fléchées


Scope, this et les fonctions fléchées sont des concepts complexes qui ne sont pas faciles à saisir, en particulier lorsque vous commencez à utiliser JavaScript et Angular. Examinons-les ensemble!

Que signifie Scope en JavaScript? 🤔

Il est difficile de dire ce que cela signifie dans un oscilloscope si nous ne définissons pas d'abord ce que signifie réellement un champ .

Souvenez-vous que scène populaire dans Le Roi Lion où le gros chat dit au chat smol que tout ce que la lumière touche sera son royaume? Il faisait en fait référence à la portée de ce que comprend sa terre.

 chat portant une crinière de lion jouant avec des animaux jouets

Tout ce qui se trouve dans le champ de cette terre qui est touché par la lumière est considéré comme étant dans la portée . Il fait partie du règne. Tout ce qui est en dehors de la terre qui est touché par la lumière, où vivent les hyènes, est hors de portée.

La portée dans le langage JavaScript est l'endroit où vit une variable, une fonction ou un objet et comment y accéder. Certaines variables vivent au pays des chats, d'autres au pays des hyènes.

Nous avons deux types de portées en JavaScript: globale et locale. Examinons les deux plus en détail.

Global Scope 🌍

Tout ce qui se trouve dans la portée globale est accessible n'importe où dans votre code, y compris l'environnement JavaScript lui-même. Dans notre exemple, chaque animal qui vit à l'intérieur du pays de la lumière est dans la portée globale.

Par exemple, lorsque vous êtes dans les outils de développement du navigateur (clic droit, inspectez l'élément, ouvrez l'onglet de la console) et que vous écrivez window. document, vous voyez l'intégralité du code HTML de la page sur laquelle vous vous trouvez dans la console. Cela est possible car l'objet window est global dans le navigateur.

Les éléments globaux sont accessibles n'importe où sans code, même s'ils sont appelés ou utilisés dans d'autres fonctions ou méthodes à l'intérieur des objets.

 console .  log  ( window )  
 var  globalVar  =   'HAI'  

 function   insideAFunction  ( )   {
  console .  log  ( window  globalVar )  


   var   nestedFunction   =   function  ([19659015])   {
    console .  log  ( window  globalVar )  
  } 
} 

Local Scope

Tout ce qui a été déclaré ou "né »À l'intérieur d'une fonction existe dans la portée locale de cette fonction, ce qui signifie que tout code en dehors de la fonction n'en sera absolument pas conscient.

Quand vous pensez à la portée locale, pensez à la confidentialité de votre votre propre maison – tout ce qui se passe à l'intérieur n'est pas connu du monde extérieur (espérons-le!), mais uniquement des personnes qui y vivent.

 George Clooney jetant un œil au-dessus d'un buisson

Maintenant, pensez à votre quartier —Il a en lui-même de nombreuses maisons, chacune avec sa propre portée locale, mais le quartier lui-même est aussi une zone plus grande qui a sa propre portée locale, et ainsi de suite jusqu'à ce que vous atteigniez la limite globale. :

  function   meUsesLocalScope  ()   {
     var  meIsLocal  =   «Salut! Je suis nouveau. »; 
    console .  log  ( meIsLocal ) ; 
} ; 

 meUsesLocalScope  () ; 



console .  log  ( meIsLocal ) ; 

Regardons cet exemple étendu, qui mélange les deux portées, car nous avons parfois besoin d'utiliser des éléments globaux dans notre fonctions:

  var  meIsGlobal  =   'Salut! Tout le monde me connaît. Je vais vous présenter! »; 
  
 function   meUsesGlobalAndLocalScopeElements  ()   {
   var  meIsLocal  =  « Salut! Je suis nouveau. »; 
  console .  log  ( meIsLocal ) ; 
  console .  log  ( meIsGlobal ) ;  
} ; 

 meUsesGlobalAndLocalScopeElements  () ; 


console .  log  ( meIsGlobal ) ; 



console .  log  ( meIsLocal ) ; 

Un rappel rapide sur ce que c'est

Le mot this est un spécial mot-clé en JavaScript, ce qui signifie qu'il peut être utilisé n'importe où dans votre code.

Ce est une référence au soi d'un élément. Pensez au mot me en anglais. Moi en soi dépend de qui l'orateur est, quand je dis moi je veux dire Marina Mosti. Quand vous dites moi cela prend un contexte et une signification complètement différents.

 John Stamos disant "C'est bien moi."

Tout comme en anglais, this prend le sens de qui l'utilise – en général, l'objet contenant ou la fonction dans laquelle il est écrit, à quelques exceptions près.

How Do Scope and This Play Together?

Selon l'endroit d'où vous appelez ce il vous donnera des résultats différents. Terrible, je sais 😱 – gardez à l'esprit l'exemple de moi .

Vous souvenez-vous de notre exemple concernant la portée globale dans le navigateur? Si vous appelez this dans la portée global vous obtiendrez l'objet window.

L'impression de ce document donne le même résultat que window.document. Essayez-le dans votre navigateur!

Prenons l'exemple suivant:

  function   simpleMath  ()   {

         function   add  (  a  b )   {
           const  c  =  a  +  b ; 
          console .  log  (  `a + b =  $ { c } `   ) 
        } [19659119] const  a  =   3 ; 
   const  b  =   5 ; 
  console .  log  (  `a =  $ { a }  and b =  $ { b  }  ` ) 
   add  ( a  b ) ; 
} 


 simpleMath [19659015] () ; 
 this .  simpleMath  () ; 

Ce code s'exécutera sans erreur. Mais que se passe-t-il si vous essayez de changer add (a, b) à l'intérieur de la fonction simpleMath en this.add (a, b) ?

Maintenant, le code renvoie une erreur. Mais pourquoi? La logique indiquerait que ceci devrait indiquer la portée de simpleMath et que add devrait être dans cette portée. Cependant, dans ce cas, ceci se réfère à la portée globale. Et la portée globale ne connaît pas une fonction nommée add .

Si vous exécutez ce code dans la console du navigateur, this est l’objet fenêtre. Donc, si vous console.log (this) à l'intérieur de simpleMath vous verrez l'objet window imprimé dans la console – y compris la référence à simpleMath puisqu'il lui-même est sur la portée globale.

Ok, gardons le même concept mais écrivons-le un peu différemment.

  const  math  =   {
  a :   3 
  b :   5 
  ajouter :   function  ()   {
     const  c  =   this .  a  + [19659028] ceci .  b ; 
    console .  log  (  `a + b =  $ { c } `   ) 
  } [19659015]
  multiplier :   fonction  ()   {
     const  d  =   this .  a  * [19659028] ceci .  b ; 
    console .  log  (  `a * b =  $ { d } "   ) ; [19659172]} 
  print :   function  ()   {
    console .  log  (  `a =  $ { this .  a }  and b =  $ { this .  b }  ` ) ; 
     this .  add  ( ]) ; 
     this .  multiplié  () ; 
    console .  log  (  this  ) 
  } 
} 

math .  print  () ; 

Cette fois, nous avons créé un objet appelé math qui contient toute notre logique mathématique.

Dans ce exemple, this se réfère à la portée locale ou à l'objet math donc tout ce qui se trouve à l'intérieur de cet objet se trouve dans this . Les objets se comportent comme des personnes: quand une personne dit moi ils se veulent eux-mêmes; quand un objet dit ceci cela signifie lui-même.

Essayez console.log (this) dans l'une des fonctions. Vous verrez tout ce qui est déclaré à l'intérieur de math imprimé dans la console.

Maintenant, écrivez console.log (this) juste après math.print () . Vous verrez à nouveau l'objet window, car maintenant ce est appelé en dehors de math ce qui signifie qu'il fait référence à la portée globale.

Il y a encore une chose dont nous avons besoin pour soyez conscient quand il s'agit d'utiliser cette – fonctions fléchées. Respirez profondément et abordons-le ensemble.

Les fonctions de flèche et celle-ci

Les fonctions de flèche ont été introduites dans ES6. C'est une manière abrégée d'écrire une fonction smol.

Pre ES6:

  let  numbers  =   [  10   15  ,   20   25   30  ] ; 
 let  greaterThanFifteen  =  numbers . [19659014] filtre  (  fonction  ( numéro )   {
   retour  numéro >   15 ; 
 }  ) ; 

Utilisation des fonctions fléchées:

  let  nombres  =   [  10   15  ,   20   25   30  ] ; 

 let  greaterThanFifteen  =  numbers . [19659014] filtre  ( numéro  =>  numéro >   15  ) 

Si vous avez besoin d'un rappel sur la syntaxe, vous peut en savoir plus sur les fonctions fléchées sur MDN .

Si vous êtes comme moi et que vous préférez le bonbon pour les yeux de => à la fonction vous devez soyez conscient d'un effet secondaire qu'elle peut provoquer avec la portée et le mot-clé this .

La portée d'une fonction fléchée n'a pas de this qui lui est propre. Il hérite du ce de la portée englobante. C'est la chose la plus importante dont vous devez vous souvenir.

Revenons à notre objet (simplifié) math .

  const  math  =   { 
  a :   3 
  b :   5 
  ajouter :   function  ()   {
     let  c  =   this .  a  + [19659028] ceci .  b ; 
    console .  log  (  `a + b =  $ { c } `   ) 
  } [19659015]
  print :   function  ()   {
    console .  log  (  `a =  $ { this .  a }  and b =  $ { this .  b }  ` ) ; 
     this .  add  ( ]) ; 
  } 
} 
math .  print  () ; 

Tout va bien, ça marche comme prévu. Réécrivons maintenant ajouter avec la syntaxe de la flèche.

  const  math  =   {
  a :   3 
  b :   5 
  ajouter :   ()   =>   {
     let  c  =   this .  a  +   ceci .  b ; 
    console .  log  (  `a + b =  $ { c } `   ) 
  } [19659015]
  print :   function  ()   {
    console .  log  (  `a =  $ { this .  a }  and b =  $ { ceci .  b }  ` ) ; 
     this .  add  ( ]) ; 
  } 
} 
math .  print  () ; 

Si vous exécutez ce code, vous obtiendrez une erreur disant ceci n'est pas défini dans cette ligne: [19659013] let c = this . a + this . b ;

C'est car ce est hérité de la portée englobante, qui dans ce cas signifie la portée de la fonction print et seulement cette portée.

Si vous appelez math.add () en dehors de l'objet math puis le this inside add va pointer vers la portée globale, et this.b recherchera en fait b inside window.b .

L'une des solutions possibles pour conserver notre structure d'objet serait dans le code illustré ci-dessous .

  const  math  =   {
  a :   3 
  b :   5 
  ajouter :   ( a  b )   =>  a  +  b 
  print :   function  ()   {
    console .  log  (  `a =  $ { this .  a }  and b =  $ { ceci .  b }  ` ) ; 
     let  c  =   this  ].  ajouter  (  this .  a   this .  b ) ; 
    console .  log  ( c ) 
  } 
} 

Nous devons passer a et b comme arguments à ajouter . Plus d'erreurs.

Conclusion

Scope, this et les fonctions fléchées sont des concepts complexes qui ne sont pas faciles à saisir. Ne vous sentez pas mal si cela vous prend un peu de temps pour les entourer. Une fois que vous avez fait, vous débloquerez beaucoup de puissance dans JavaScript et Angular!

L'important est que vous gardiez toujours à l'esprit que si vous rencontrez une sorte de comportement «étrange» dans une fonction fléchée, un coupable habituel et un bon endroit pour commencer le débogage est de voir s'il y a une mauvaise utilisation du mot-clé this .

Pour plus d'informations concernant this veuillez consulter cette documentation MDN page .

Comme toujours, merci d'avoir lu et partagez avec moi vos expériences sur Twitter à: @marinamosti .

PS Tous saluent l'avocat magique! 🥑

P.P.S. ❤️🔥🐶☠️






Source link