ce mot-clé est l'un des mécanismes les plus complexes de JavaScript. Il s'agit d'un mot-clé très spécial qui est automatiquement défini dans le cadre de toutes les fonctions. Mais même les développeurs JavaScript très expérimentés ont du mal à dire exactement à quoi cela renvoie.
Qu'est-ce que c'est ?
Pointer sur la fonction elle-même ?
En regardant le sens littéral, il est facile pour les gens de penser que cela pointe vers la fonction elle-même. Est-ce vraiment le cas ? Nous pouvons regarder un exemple.
function foo() {
this.count = this.count ? this.count + 1 : 1;
}
for (let i = 0; i < 5; i++) {
foo();
}
console.log(foo.count); // undefined
Copier après la connexion
Vous pouvez voir que la sortie de foo.count n'est pas le 5 auquel nous nous attendions, mais le 0 attribué au début. En d’autres termes, 5,而是一开始赋值的0。也就是说this其实并没有指向函数本身。
指向作用域?
还有一种比较常见的误解是,this指向了函数的作用域。
function foo() {
var a = 2;
bar();
}
function bar() {
console.log(this.a);
}
foo(); // undefined
最后要介绍的是使用newcela ne pointe pas réellement vers la fonction elle-même .
Pointer vers la portée ?
Un autre malentendu courant est que cela indique la portée de la fonction.
function Foo(a) {
this.a = a;
}
var bar = new Foo(2);
bar.a; // 2
Copier après la connexion
Dans ce code, bar est exécuté dans foo et la sortie de this.a est indéfini. En d’autres termes,
cela n’indique pas la portée de la fonction.
Ce n’est pas ça, ce n’est pas ça, qu’est-ce que c’est ? Lors de l'exécution de la fonction, un contexte d'exécution (un enregistrement) sera créé. Il s'agit d'un attribut dans ce contexte et est utilisé lors de l'exécution. L'intérêt de cela dépend de l'endroit où la fonction est appelée. Cette règle contraignanteCette règle comporte quatre règles qui peuvent être suivies, qui seront présentées une par une ci-dessous. 1. La liaison par défaut
La liaison implicite signifie si appartient ou est inclus par un objet lorsque la fonction est exécutée. En d'autres termes, lorsque la fonction est en cours d'exécution, il n'est pas très clair si elle est exécutée en tant qu'attribut d'un objet : 🎜rrreee🎜Dans l'exemple, foo est exécuté en tant qu'attribut d'obj. , obj sert de contexte à la fonction, et cela pointe vers obj. this.a est équivalent à obj.a. Dans l'appel de la chaîne de propriétés de l'objet, seul le dernier calque affectera la position appelante, ce qui signifie que le dernier calque affectera ce point. 🎜🎜De nombreux amis front-end ont peut-être vu cette question lors d'entretiens : 🎜rrreee🎜C'est le problème le plus courant avec la liaison implicite, 🎜Perte implicite : les fonctions implicitement liées perdront l'objet lié 🎜. Bien que bar soit une référence à obj.foo, elle fait en fait référence à la fonction foo elle-même. La fonction bar est un appel à une fonction indépendante. À ce stade, this pointe vers window|undefined<.> . 🎜🎜Il existe également une fonction de rappel classique, ce problème de pointage qui est également implicitement perdu. 🎜rrreee🎜Résumé : Dans la liaison implicite, lors de l'attribution de valeurs (les rappels sont des affectations implicites), vous devez accorder une attention particulière à la question de la perte implicite. 🎜🎜3. Afficher la liaison🎜🎜La fonction en JavaScript fournit deux méthodes <code>call et apply Le premier paramètre transmis est un objet, et ce sera Lié à cet objet. Si une valeur primitive (chaîne, nombre, Booléen) est transmise, elle sera convertie en sa forme objet (new String(), new Boolean(), new Number()). 🎜rrreee🎜Bien que nous puissions utiliser call et apply pour spécifier explicitement le point de ceci, il reste toujours le problème de la perte de liaison. Cela peut être résolu via ce que l'on appelle la liaison dure (fonction de liaison), je n'entrerai donc pas dans les détails ici. 🎜🎜4. new🎜🎜La dernière chose que je veux présenter est d'utiliser new pour modifier la liaison de ceci. Les chaussures pour enfants qui ont implémenté manuellement new devraient être plus claires sur new in js et new in. d'autres langues. Complètement différent. 🎜Nouveau processus d'exécution : 🎜🎜🎜Créer un objet vide 🎜🎜L'objet vide actuel effectue un ancrage du prototype 🎜🎜Renvoyer le résultat de l'exécution de la fonction ou l'objet vide actuel 🎜🎜rrreee🎜Lors de l'utilisation de new pour appeler une fonction, nous construirons un nouveau object et liez-le à ceci dans l’appel de fonction. 🎜🎜Priorité🎜🎜Enfin, parlons brièvement de la relation de priorité : nouvelle liaison d'affichage > liaison implicite > liaison par défaut. 🎜🎜Apprentissage recommandé : "🎜🎜Tutoriel sur les bases de JavaScript🎜🎜"🎜🎜🎜
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!
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