Maison > interface Web > js tutoriel > Pourquoi « ceci » en JavaScript diffère des autres langages POO

Pourquoi « ceci » en JavaScript diffère des autres langages POO

Linda Hamilton
Libérer: 2025-01-17 14:34:12
original
698 Les gens l'ont consulté

Why

Le mot-clé this de JavaScript est souvent source de confusion, en particulier pour les développeurs issus de langages comme C#, Java ou Python, où self fait systématiquement référence à l'instance d'objet actuelle. Contrairement à ces langages, le this de JavaScript est dynamique, sa valeur étant déterminée par le contexte d'invocation de la fonction. Ce guide résume les différents scénarios impactant le comportement de this.

1. Portée mondiale :

  • Mode non strict : this pointe vers l'objet global (window dans les navigateurs, global dans Node.js).
<code class="language-javascript">console.log(this); // window or global</code>
Copier après la connexion
Copier après la connexion
  • Mode strict : this est undefined.
<code class="language-javascript">"use strict";
console.log(this); // undefined</code>
Copier après la connexion
Copier après la connexion

2. Fonctions intérieures :

  • Fonctions régulières : En mode non strict, this fait référence à l'objet global ; en mode strict, c'est undefined.
<code class="language-javascript">function myFunc() {
  console.log(this); 
}
myFunc(); // window (non-strict), undefined (strict)</code>
Copier après la connexion
Copier après la connexion

3. Méthodes d'objet :

  • Lorsqu'une fonction est appelée en tant que méthode objet, this fait référence à cet objet.
<code class="language-javascript">const myObj = {
  name: "JavaScript",
  greet() {
    console.log(this.name); // this refers to myObj
  }
};
myObj.greet(); // Output: JavaScript</code>
Copier après la connexion

4. Fonctions fléchées :

  • Les fonctions fléchées n'ont pas leur propre this. Ils héritent this de leur portée lexicale (contexte environnant).
<code class="language-javascript">const myObj = {
  name: "JavaScript",
  arrowFunc: () => {
    console.log(this.name); // Inherits this from the global scope
  }
};
myObj.arrowFunc(); // undefined (in browsers, this is window)</code>
Copier après la connexion

5. Constructeurs :

  • Au sein d'une fonction ou d'une classe constructeur, this fait référence à l'instance nouvellement créée.
<code class="language-javascript">class Person {
  constructor(name) {
    this.name = name;
  }
  greet() {
    console.log(`Hello, ${this.name}`);
  }
}

const person = new Person("Alice");
person.greet(); // Output: Hello, Alice</code>
Copier après la connexion

6. Liaison explicite (call, apply, bind) :

Les fonctions JavaScript sont des objets avec des méthodes (call, apply, bind) pour définir explicitement this.

  • call et apply appellent la fonction avec une valeur this spécifiée. call utilise des arguments séparés par des virgules ; apply prend un tableau.
<code class="language-javascript">function greet(greeting) {
  console.log(`${greeting}, ${this.name}`);
}

const user = { name: "Alice" };
greet.call(user, "Hello"); // Output: Hello, Alice
greet.apply(user, ["Hi"]); // Output: Hi, Alice</code>
Copier après la connexion
  • bind renvoie une nouvelle fonction avec this lié ​​en permanence.
<code class="language-javascript">const boundGreet = greet.bind(user);
boundGreet("Hello"); // Output: Hello, Alice</code>
Copier après la connexion

7. Auditeurs de l'événement :

  • Fonctions régulières : this fait référence à l'élément déclenchant l'événement.
<code class="language-javascript">const btn = document.querySelector("button");
btn.addEventListener("click", function() {
  console.log(this); // The button element
});</code>
Copier après la connexion
  • Fonctions fléchées : this hérite de la portée environnante, pas de l'élément.
<code class="language-javascript">btn.addEventListener("click", () => {
  console.log(this); // this depends on the arrow function's definition context
});</code>
Copier après la connexion

8. setTimeout / setInterval :

  • Fonctions régulières : this par défaut, l'objet global.
<code class="language-javascript">setTimeout(function() {
  console.log(this); // window in browsers
}, 1000);</code>
Copier après la connexion
  • Fonctions fléchées : this est héritée lexicalement.
<code class="language-javascript">setTimeout(() => {
  console.log(this); // Inherits this from surrounding context
}, 1000);</code>
Copier après la connexion

9. Cours :

  • Dans une méthode de classe, this fait référence à l'instance de classe.
<code class="language-javascript">console.log(this); // window or global</code>
Copier après la connexion
Copier après la connexion

10. Perte de contexte (méthode d'extraction) :

Attribuer une méthode à une variable ou la transmettre en tant que rappel peut entraîner this une perte de liaison.

<code class="language-javascript">"use strict";
console.log(this); // undefined</code>
Copier après la connexion
Copier après la connexion

Solutions : Utilisez .bind(obj) ou une fonction flèche pour maintenir le contexte.

11. new Mot clé :

Utiliser new avec une fonction crée un nouvel objet et this fait référence à cet objet.

<code class="language-javascript">function myFunc() {
  console.log(this); 
}
myFunc(); // window (non-strict), undefined (strict)</code>
Copier après la connexion
Copier après la connexion

Tableau récapitulatif :

Contexte
Context this Refers To
Global (non-strict) Global object (window/global)
Global (strict) undefined
Object Method The object owning the method
Arrow Function Lexical scope (surrounding context)
Constructor/Class The instance being created
call, apply, bind Explicitly defined value
Event Listener The element triggering the event
setTimeout/setInterval Global object (regular function), lexical scope (arrow function)
new Keyword The newly created object
Fait référence à
ête> Global (non strict) Objet global (fenêtre/global) Global (strict) non défini Méthode objet L'objet propriétaire de la méthode Fonction flèche Portée lexicale (contexte environnant) Constructeur/Classe L'instance en cours de création appeler, appliquer, lier Valeur explicitement définie Écouteur d'événements L'élément déclenchant l'événement setTimeout/setInterval Objet global (fonction régulière), portée lexicale (fonction flèche)

Mot clé

L'objet nouvellement créé thisComprendre ces scénarios est crucial pour écrire du code JavaScript correct et prévisible. N'oubliez pas d'utiliser des techniques telles que la liaison explicite lorsque cela est nécessaire pour éviter un comportement inattendu.

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal