J'ai un constructeur qui enregistre les gestionnaires d'événements :
function MyConstructor(data, transport) { this.data = data; transport.on('data', function () { alert(this.data); }); } // Mock transport object var transport = { on: function(event, callback) { setTimeout(callback, 1000); } }; // called as var obj = new MyConstructor('foo', transport);
Cependant, je ne parviens pas à accéder à l'objet créé à l'intérieur du callbackdata
属性。看起来this
qui ne fait pas référence à l'objet créé mais à un autre objet.
J'ai également essayé d'utiliser des méthodes objet au lieu de fonctions anonymes :
function MyConstructor(data, transport) { this.data = data; transport.on('data', this.alert); } MyConstructor.prototype.alert = function() { alert(this.name); };
Mais il a aussi le même problème.
Comment accéder au bon objet ?
Voici quelques façons d'accéder au contexte parent dans le contexte enfant - H2>- Vous pouvez utiliser la fonction
- Stockez une référence à context/this dans une autre variable (voir exemple ci-dessous).
- Utilise la fonctionnalité ES6flèches.
- Changer le code, la conception fonctionnelle et l'architecture - pour cela, vous devez maîtriser lesDesign Patterns a> en JavaScript.
绑定 a>()
.1.Utilisez la
bind()
fonctionSi vous utilisez Underscore.js -http://underscorejs.org/#bind
2. Stockez la référence au contexte/this dans une autre variable
3.Fonction flèche
À propos
此内容您应该了解
this
(alias "contexte") est un mot-clé spécial dans chaque fonction dont la valeur dépend uniquement decommentla fonction est appelée, et non de comment/quand/où elle est définie. Elle n'est pas affectée par la portée lexicale comme les autres variables (sauf les fonctions fléchées, voir ci-dessous). Voici quelques exemples :Pour en savoir plus sur
此
, consultez laDocumentation MDN.Comment citer correctement
this
Utilisez lesfonctions fléchées
ECMAScript 6 introduit desfonctions fléchées, qui peuvent être considérées comme des fonctions lambda. Ils n'ont pas leur propre reliure
est recherché dans la portée, tout comme une variable normale. Cela signifie que vous n'avez pas besoin d'appelerthis
绑定。相反,this
就像普通变量一样在范围内查找。这意味着您不必调用.bind
. Au lieu de cela,.bind
. Ce n'est pas leur seul comportement spécial, consultez la documentation MDN pour plus d'informations.这个
Ne pas utiliser
spécifiquement, maisthis
,而是访问它引用的对象。这就是为什么一个简单的解决方案是简单地创建一个也引用该对象的新变量。变量可以有任何名称,但常见的是self
和that
Vous ne souhaitez pas réellement accéder àaccéder à l'objet auquel il fait référence
self
是一个普通变量,因此它遵循词法范围规则并且可以在回调内部访问。这还有一个优点,即您可以访问回调本身的this
. C'est pourquoi une solution simple consiste simplement à créer une nouvelle variable qui fait également référence à l'objet. Les variables peuvent avoir n'importe quel nom, mais les plus courants sontself
etthat
.Puisque
self
est une variable normale, elle suit les règles de portée lexicale et est accessible dans le rappel. Cela présente également l'avantage que vous pouvez accéder à la valeurthis
du rappel lui-même.Définition explicite des rappels
this
- Partie 1Il peut sembler que vous n'avez aucun contrôle sur la valeur depuisque sa valeur est définie automatiquement, mais ce n'est pas réellement le cas.
Chaque fonction a la méthode.bind
[docs],它返回一个新函数,其中this
绑定到一个值。该函数与您调用.bind
的函数具有完全相同的行为,只是this
是由您设置的。无论何时或如何调用该函数,this
[docs].bind
this
绑定到MyConstructor
的this
, qui renvoie une nouvelle fonction oùest lié à une valeur. Cette fonction a exactement le même comportement que la fonction que vous appelez
Dans cet exemple, nous lions lesdu rappel à la valeur desde.bind
, sauf que lejQuery .proxy
est défini par vous. Peu importe quand et comment la fonction est appelée,fera toujours référence à la valeur transmise.MyConstructor
. Remarque : Lors de la liaison du contexte à jQuery, utilisez plutôt [docs]. La raison en est que vous n'avez pas besoin de stocker une référence à la fonction lors de la dissociation du rappel d'événement. jQuery gère cela en interne.Configuration des rappels
this
- Partie 2Certaines fonctions/méthodes qui acceptent un rappel acceptent également une valeur à laquelle le rappel
this
应该引用的值。这与您自己绑定它基本上相同,但是函数/方法会为您完成它。Array#map
doit faire référence. C'est fondamentalement la même chose que de le lier vous-même, mais la fonction/méthode le fait pour vous.Array#map
[docs]C'est la méthode. Sa signature est :Le premier paramètre est le rappel et le deuxième paramètre est la valeur
this
doit faire référence. Voici un exemple artificiel :