Maison > interface Web > js tutoriel > Résumé et explication détaillée de ce pointeur en javaScript

Résumé et explication détaillée de ce pointeur en javaScript

黄舟
Libérer: 2017-07-22 17:02:08
original
1106 Les gens l'ont consulté

L'éditeur suivant vous apportera une synthèse de ce pointage basée sur javaScript. L'éditeur le trouve plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence pour tout le monde. Suivons l'éditeur et jetons un coup d'œil.

Le pointage de ceci en JavaScript a toujours été une préoccupation pour les collègues front-end, et c'est également le premier choix pour les questions d'entretien. Résumons maintenant le pointage de ceci. en js. Tout d'abord, vous devez comprendre quelques concepts :

1 : Les variables globales sont montées sous l'objet fenêtre par défaut

2 : Généralement, cela pointe vers son appelant

3 : Dans la fonction flèche d'es6, cela pointe vers le créateur, pas l'appelant

4 : Vous pouvez changer la direction de cela en appelant, en postulant et en vous liant

Analysons-le en détail

1 : Lors de l'appel d'une fonction

(mode non strict)


const func = function () {
  console.log(this);
  const func2 = function () {
   console.log(this);
  };
  func2(); //Window
 };
 func(); //Window
Copier après la connexion

(mode strict)


'use strict'
 const func = function () {
  console.log(this);
  const func2 = function () {
   console.log(this);
  };
  func2(); //undefined
 };
 func(); //undefined
Copier après la connexion

Combinaison de la quatrième et de la première règles : func est une fonction globale et est monté par défaut Sous l'objet window, cela pointe vers son appelant, window, donc l'objet window est affiché. Cependant, en mode strict, cela n'est pas autorisé à pointer vers la variable globale window, donc la sortie n'est pas définie (func2 pointe vers. la fenêtre globale par défaut lorsque la fonction est appelée directement. En fait, il s'agit d'un défaut dans la conception JavaScript. La méthode de conception correcte est que celle de la fonction interne doit être liée à l'objet correspondant à sa fonction externe. Ce défaut de conception, les programmeurs JavaScript intelligents ont mis au point des méthodes de substitution de variable, par convention, la variable est généralement nommée ainsi (cette méthode sera discutée ensuite).

2 : En tant que méthode objet


const user = {

  userName: '小张',
  age: 18,
  selfIntroduction: function () {
   const str = '我的名字是:' + this.userName + ",年龄是:" + this.age;
   console.log(str);

   const loop = function () {
    console.log('我的名字是:' + this.userName + ",年龄是:" + this.age);
   };

   loop();  //我的名字是:undefined,年龄是:undefined

  }
 };

 user.selfIntroduction(); //我的名字是:小张,年龄是:18
Copier après la connexion

Selon notre première règle, ce Points à son appelant. L'appelant de la méthode selfIntroduction() est l'utilisateur, donc à l'intérieur de la méthode selfIntroduction(), cela pointe vers son objet parent, l'utilisateur, et la raison pour laquelle la méthode de boucle génère un résultat non défini est le javascript que j'ai mentionné ci-dessus. défaut de conception. Dans ce cas, nous choisissons généralement de le mettre en cache dans la méthode selfIntroduction().


const user = {
  userName: '小张',
  age: 18,
  selfIntroduction: function () {
   const str = '我的名字是:' + this.userName + ",年龄是:" + this.age;
   console.log(str);

   const that=this;

   const loop = function () {
    console.log('我的名字是:' + that.userName + ",年龄是:" + that.age);
   };

   loop();  //我的名字是:小张,年龄是:18

  }
 };

 user.selfIntroduction(); //我的名字是:小张,年龄是:18
Copier après la connexion

A ce moment, ce point de la boucle est idéal.


const user={

  userName:'小张',
  age:18,
  selfIntroduction:function(){
   const str='我的名字是:'+this.userName+",年龄是:"+this.age;
   console.log(str); 
  }
 };

 const other =user.selfIntroduction;
 other(); //我的名字是:undefined,年龄是:undefined

 const data={
  userName:'小李',
  age:19,
 };
 data.selfIntroduction=user.selfIntroduction;
 data.selfIntroduction(); //我的名字是:小李,年龄是:19
Copier après la connexion

En regardant ce code, attribuez selfIntroduction() à la variable globale other, appelez la méthode other(), et other est monté sous l'objet fenêtre de fonction globale , il n'y a pas d'attributs userName et age sous l'objet window, donc la sortie n'est pas définie. Le deuxième morceau de code déclare l'objet data, qui contient les attributs username et age. Rappelez-vous notre deuxième règle. Généralement, cela pointe vers son appelant. Tout le monde comprendra que data est l'appelant de la fonction selfIntroduction(), donc le userName. et l'âge des données sont affichés.

3 : Déclenché comme un événement en html


<body>

 <p id="btn">点击我</p>

</body>
Copier après la connexion


const btn=document.getElementById(&#39;btn&#39;);

  btn.addEventListener(&#39;click&#39;,function () {
   console.log(this); //<p id="btn">点击我</p>
  })
Copier après la connexion

Dans ce cas, la deuxième règle est effectivement suivie. Généralement, ceci pointe vers son appelant, et cela pointe vers la source de l'événement, qui est l'événement.

4 : nouveau mot clé (constructeur)


const fun=function(userName){
  this.userName=userName;
 }
 const user=new fun(&#39;郭德纲&#39;); 
 console.log(user.userName); //郭德纲
Copier après la connexion

Je n'entrerai pas dans les détails sur ce Oui, le mot-clé new construit une instance d'objet et l'attribue à l'utilisateur, donc userName devient un attribut de l'objet utilisateur.

5:es6 (fonction flèche)


const func1=()=>{
  console.log(this); 
 };
 func1(); //Window
Copier après la connexion


const data={
  userName:&#39;校长&#39;,
  selfIntroduction:function(){
   console.log(this); //Object {userName: "校长", selfIntroduction: function}

   const func2=()=>{
    console.log(this); //Object {userName: "校长", selfIntroduction: function}
   }

   func2();
  }

 }

 data.selfIntroduction();
Copier après la connexion

Tout le monde regarde la troisième règle que j'ai mentionnée au début : dans la fonction flèche d'es6, cela pointe vers le créateur, pas l'appelant. fun1 est créé sous la fonction globale, donc cela pointe vers la fenêtre globale. , et fun2 est dans l'objet Créé sous data, cela pointe vers l'objet de données, donc à l'intérieur de la fonction func2, cela pointe vers l'objet de données. Je pense personnellement que ce point de la fonction flèche es6 est une amélioration par rapport au JavaScript. défauts de conception que j'ai mentionnés ci-dessus (connaissance personnelle).

6 : Changer le point de ceci

Les trois fonctions call, apply et bind peuvent artificiellement changer le point de this de la fonction . Je n’entrerai pas dans les détails des différences entre les trois ici, j’expliquerai les différences entre les trois en détail dans les prochains blogs. Prenons un exemple.


const func=function(){
 console.log(this);
};

func(); //window

func.apply({userName:"郭德纲"}); //Object {userName: "郭德纲"}
Copier après la connexion

Ces trois méthodes peuvent artificiellement changer la direction de ceci. La différence est que call et apply lieront cette méthode. sera exécuté immédiatement après avoir défini ceci, et la méthode bind renverra une fonction exécutable.

Une grande partie de cela peut être résumée par les 4 points que j'ai mentionnés au début

1 : Global les variables sont montées par défaut dans l'objet Sous la fenêtre

2 : Généralement, cela pointe vers son appelant

3 : Dans la fonction flèche d'es6, cela pointe vers le créateur, pas l'appelant

4 : Par appel, postuler, Bind peut changer la direction de cela

Pour être honnête, c'est la première fois que j'écris un blog. Je suis vraiment nerveux. Est-ce que quelqu'un lira mon blog ? Cela pourrait-il être mal écrit ? ...J'ai beaucoup mieux réfléchi et j'ai résumé : j'accepte les corrections sur d'éventuelles lacunes.

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal