web-dev-qa-db-fra.com

'ceci' n'est pas défini dans la boucle foreach

J'écris du code TypeScript et j'itère un tableau. À l'intérieur de la boucle, j'essaie d'accéder à "cet" objet pour effectuer un traitement comme:

console.log('before iterate, this = ' +this);
myarray.days.forEach(function(obj, index) {
    console.log('before transform, this : ' + this);
    this.datePipe.transform...
});

mais cela échoue, car il se plaint que "ceci" n'est pas défini "cet" objet s'imprime correctement comme [objet objet] avant/en dehors de la boucle, mais à l'intérieur de la boucle, il n'est pas défini. Pourquoi donc? Et quelle est la solution pour cela?

24
user1892775

Vous devez soit utiliser une fonction flèche :

myarray.days.forEach((obj, index) => {
    console.log('before transform, this : ' + this);
    this.datePipe.transform...
});

Ou utilisez la méthode bind :

myarray.days.forEach(function(obj, index) {
    console.log('before transform, this : ' + this);
    this.datePipe.transform...
}.bind(this));

La raison en est que lors du passage d'une fonction régulière en tant que rappel, lorsqu'elle est invoquée, this n'est pas réellement conservé.
Les deux méthodes que j'ai mentionnées ci-dessus garantiront que la bonne portée this est préservée pour la future exécution de la fonction.

55
Nitzan Tomer

Ajoutez le this comme paramètre de rappel.

L'ajout de }, this); Au lieu de }.bind(this)); devrait résoudre le problème dans Angular.

Ainsi, devrait ressembler à:

myarray.days.forEach(function(obj, index) {
    console.log('before transform, this : ' + this);
    this.datePipe.transform...
}, this);
7
rc.adhikari

Essaye ça:

myarray.days.forEach( (obj) => {
    console.log('before transform, this : ' + this);
    this.datePipe.transform...
});
1
Eray T