Skip to content

Commit a733d5c

Browse files
committed
docs: tra 1st solution section
1 parent caa5efe commit a733d5c

File tree

1 file changed

+52
-1
lines changed

1 file changed

+52
-1
lines changed

1-js/06-advanced-functions/10-bind/article-fr.md

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,55 @@ setTimeout(f, 1000); // Perte du contexte d'user
4141
La méthode `setTimeout` dans le navigateur est un peu spéciale : elle définit `this=window` pour l'appel à la fonction (pour Node.js, `this` devient un objet "timer", mais ça n'a pas d'importance ici). Donc pour `this.firstName` il essaye de récuperer `window.firstName`, qui n'existe pas. Dans d'autres cas similaires, généralement `this` devient juste `undefined`.
4242

4343
Cette tâche est plutôt commune -- on veut passer une méthode objet quelque part ailleur (ici -- au scheduler) où elle sera appelée.
44-
Comment s'assurer qu'elle sera appelée dans le bon contexte ?
44+
Comment s'assurer qu'elle sera appelée dans le bon contexte ?
45+
46+
## Solution 1 : Une enveloppe
47+
48+
La solution la plus simple est d'utiliser une fonction enveloppée :
49+
50+
```js run
51+
let user = {
52+
firstName: "John",
53+
sayHi() {
54+
alert(`Hello, ${this.firstName}!`);
55+
}
56+
};
57+
58+
*!*
59+
setTimeout(function() {
60+
user.sayHi(); // Hello, John!
61+
}, 1000);
62+
*/!*
63+
```
64+
65+
Maintenant ça fonctionne, car elle reçoit `user` depuis un environnement lexical extérieur, et donc les appels à la fonction se font normalement.
66+
67+
La même chose mais en plus court :
68+
69+
```js
70+
setTimeout(() => user.sayHi(), 1000); // Hello, John!
71+
```
72+
73+
Ça à l'air bon, mais une légère vulnérabilité apparaît dans la structure de notre code.
74+
75+
Qu'est ce qu'il se passe si avant le déclenchement de `setTimeout` (il y une seconde de délai) `user` changeait de valeur ? Alors, soudainement, ça appelera le mauvais objet !
76+
77+
```js run
78+
let user = {
79+
firstName: "John",
80+
sayHi() {
81+
alert(`Hello, ${this.firstName}!`);
82+
}
83+
};
84+
85+
setTimeout(() => user.sayHi(), 1000);
86+
87+
// ...La valeur d'user dans 1 seconde
88+
user = {
89+
sayHi() { alert("Another user in setTimeout!"); }
90+
};
91+
92+
// Un autre user est dans le setTimeout !
93+
```
94+
95+
La prochaine solution garantit que ce genre de chose n'arrivera pas

0 commit comments

Comments
 (0)