You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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`.
42
42
43
43
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.
Ç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