Comment accéder correctement à cet objet dans la fonction de rappel
P粉608647033
2023-08-20 16:11:32
<p>J'ai un constructeur qui enregistre un gestionnaire d'événements : </p>
<p><br /></p>
<pre class="snippet-code-js lang-js Prettyprint-override"><code>function MyConstructor(data, transport) {
this.data = données ;
transport.on('données', fonction () {
alerte (this.data);
});
}
//Simuler l'objet de transfert
var transport = {
sur : fonction (événement, rappel) {
setTimeout(rappel, 1000);
}
} ;
// Méthode d'appel
var obj = new MyConstructor('foo', transport);</code></pre>
<p><br /></p>
<p>Cependant, dans la fonction de rappel, je ne peux pas accéder aux propriétés <code>data</code> Il semble que <code>this</code> ne pointe pas vers l'objet créé, mais vers un autre objet. </p>
<p>J'ai également essayé d'utiliser des méthodes objet au lieu de fonctions anonymes : </p>
<pre class="brush:php;toolbar:false;">function MyConstructor(data, transport) {
this.data = données ;
transport.on('data', this.alert);
}
MonConstructor.prototype.alert = function() {
alert(ce.nom);
};</pré>
<p>Mais il y avait aussi le même problème. </p>
<p>Comment accéder au bon objet ? </p>
Voici quelques façons d'accéder au contexte parent dans le contexte enfant :
bind()
.1. Utilisez la
bind()
fonctionSi vous utilisez Underscore.js - http://underscorejs.org/#bind
2. Stockez la référence du contexte/this dans une autre variable
3. Fonction flèche
Connaissances sur
this
this
(également appelé « contexte ») est un mot-clé spécial à l'intérieur de chaque fonction dont la valeur dépend uniquement de la manière dont la fonction est appelée, et non de la manière dont elle est définie. Elle n'est pas affectée par la portée lexicale, contrairement aux autres variables (sauf les fonctions fléchées, voir ci-dessous). Voici quelques exemples :Pour en savoir plus sur
this
, veuillez vous référer à la Documentation MDN.Comment citer correctement
this
Utilisez les fonctions fléchées
ECMAScript 6 a introduit les fonctions fléchées, qui peuvent être considérées comme des fonctions lambda. Ils n'ont pas leurs propres
est recherché dans la portée, tout comme une variable normale. Cela signifie que vous n'avez pas besoin d'appelerthis
绑定。相反,this
在作用域中查找,就像普通变量一样。这意味着你不需要调用.bind
fixations. Au lieu de cela,.bind
. Ils ont également d'autres comportements spéciaux, consultez la documentation MDN pour plus d'informations.this
Non utiliséthis
,而是需要访问它所指的对象。因此,一个简单的解决方案是创建一个新变量,也指向该对象。变量可以有任何名称,但常见的是self
和that
En fait, vous n'avez pas besoin d'accéder spécifiquement àself
etthat
.self
是一个普通变量,它遵循词法作用域规则,并且可以在回调函数内部访问。这还有一个优点,即可以访问回调函数本身的this
Puisqueself
est une variable normale, elle suit les règles de portée lexicale et est accessible dans la fonction de rappel. Cela présente également l'avantage d'avoir accès à la valeur de la fonction de rappel elle-même.this
Définition explicite de la fonction de rappelthis
Il peut sembler que vous n'avez aucun contrôle sur la valeur deChaque fonction a une méthode
.bind
[文档],它返回一个将this
绑定到一个值的新函数。该函数的行为与你调用.bind
时的函数完全相同,只是this
由你设置。无论如何或何时调用该函数,this
.bind
[docs]
this
绑定到MyConstructor
的this
, qui renvoie une nouvelle fonction qui lie à une valeur. Le comportement de cette fonction est exactement le même que lorsque vous appelez
Pour le contexte de liaison de jQuery, utilisez 🎜🎜 🎜🎜[Documentation]🎜🎜🎜. La raison en est qu'il n'est pas nécessaire de stocker une référence à la fonction lors de la dissociation du rappel d'événement. jQuery gère cela en interne. 🎜.bind
, sauf qu'il est défini par vous. Peu importe le moment où la fonction est appelée, fera toujours référence à la valeur transmise.jQuery.proxy
Dans ce cas, nous lions le de la fonction de rappel à la valeur deMyConstructor
. Remarque :Configurer la fonction de rappel
this
- Partie 2Certaines fonctions/méthodes qui acceptent une fonction de rappel acceptent également une valeur qui doit être utilisée comme
this
。这与手动绑定相同,但是函数/方法会为你执行绑定。例如,Array#map
de la fonction de rappel. C'est la même chose que la liaison manuelle, mais la fonction/méthode effectue la liaison pour vous. Par exemple,Array#map code > [Documentation]
C'est la méthode. Sa signature est :Le premier paramètre est la fonction de rappel et le deuxième paramètre est la valeur à laquelle
this
devrait faire référence. Voici un exemple artificiel :Remarque : La question de savoir si peut recevoir une valeur de
this
的值通常在函数/方法的文档中提到。例如,jQuery的$.ajax
方法 [文档]描述了一个名为context
est généralement mentionnée dans la documentation de la fonction/méthode. Par exemple, la méthode jQuery$.ajax
[Documentation]
Description Une option appelée
context
:this.method
被分配为点击事件处理程序,但是如果点击document.body
,记录的值将是undefined
,因为在事件处理程序内部,this
指的是document.body
,而不是Foo
Une autre manifestation courante de ce problème est l'utilisation de méthodes objet comme rappels/gestionnaires d'événements. En JavaScript, les fonctions sont des citoyens de première classe, et le terme « méthode » fait simplement référence à une fonction qui est la valeur de la propriété d'un objet. Mais il n'existe pas de lien spécifique entre la fonction et son objet "contenant".this
Considérons l'exemple suivant : La fonctionthis.method
est assignée comme gestionnaire d'événements de clic, mais si vous cliquez surdocument.body
, la valeur enregistrée seranon définie
car dans le gestionnaire d'événements, fait référence àdocument.body
, et non à une instance deFoo
. Comme mentionné précédemment,fait référence à la façon dont une fonction
, et non à la façon dont est définie .
.bind
将this
Cela pourrait être plus évident si le code ressemble à ceci :🎜La solution 🎜 est la même que celle mentionnée ci-dessus : utilisez
🎜Ou en utilisant la fonction anonyme comme rappel/événement.bind
pour lier explicitement 🎜 à une valeur spécifique 🎜 si disponible