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
Copy file name to clipboardExpand all lines: 1-js/06-advanced-functions/02-rest-parameters-spread/article.md
+9-9Lines changed: 9 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -8,13 +8,14 @@ Par exemple :
8
8
-`Object.assign(dest, src1, ..., srcN)` -- copie les propriétés de `src1..N` dans `dest`.
9
9
- ... etc.
10
10
11
-
Dans ce chapitre, nous allons apprendre à faire de même. Et aussi, comment passer des tableaux à des fonctions telles que des paramètres.
11
+
Dans ce chapitre, nous apprendrons à faire de même. Et aussi, comment passer des tableaux en paramètre à de telles fonctions.
12
12
13
13
## Les paramètres Rest `...`
14
14
15
15
Une fonction peut être appelée avec un nombre quelconque d'arguments, peu importe comment elle a été définie.
16
16
17
17
Comme ici :
18
+
18
19
```js run
19
20
functionsum(a, b) {
20
21
return a + b;
@@ -96,9 +97,9 @@ showName("Julius", "Caesar");
96
97
showName("Ilya");
97
98
```
98
99
99
-
Autrefois, les paramètres rest n'existaient pas dans le langage, et utiliser les `arguments` était le seul moyen d'obtenir tous les arguments de la fonction. Et cela fonctionne toujours, on peut le trouver dans l'ancien code.
100
+
Autrefois, les paramètres rest n'existaient pas dans le langage, et utiliser `arguments` était le seul moyen d'obtenir tous les arguments de la fonction. Et cela fonctionne toujours, on peut le trouver dans l'ancien code.
100
101
101
-
Mais l’inconvénient est que, bien que les `arguments` ressemblent à un tableau et qu’ils soient itératifs, ce n’est pas un tableau. Il ne supporte pas les méthodes de tableau, nous ne pouvons donc pas appeler `arguments.map(...)` par exemple.
102
+
Mais l’inconvénient est que, bien que `arguments` ressemblent à un tableau et qu’ils soient itératifs, ce n’est pas un tableau. Il ne supporte pas les méthodes de tableau, nous ne pouvons donc pas appeler `arguments.map(...)` par exemple.
102
103
103
104
De plus, il contient toujours tous les arguments. Nous ne pouvons pas les capturer partiellement, comme nous l’avons fait avec les paramètres rest.
104
105
@@ -147,7 +148,7 @@ alert( Math.max(arr) ); // NaN
147
148
148
149
Et nous ne pouvons sûrement pas lister manuellement les éléments dans le code `Math.max(arr[0], arr[1], arr[2])`, parce que nous pouvons ne pas savoir combien il y en a. Au fur et à mesure que notre script s'exécute, il peut y en avoir beaucoup ou pas du tout. Et ça deviendrait moche.
149
150
150
-
*La sytaxe Spread* à la rescousse! Il ressemble aux paramètres rest, en utilisant également `...`, mais fait tout le contraire.
151
+
*La sytaxe Spread* à la rescousse! Il ressemble aux paramètres rest, en utilisant également `...`, mais fait tout le contraire.
151
152
152
153
Quand `...arr` est utilisé dans l'appel de fonction, il "développe" un objet itérable `arr` dans la liste des arguments.
La syntaxe spread utilise en interne des itérateurs pour rassembler les éléments, de la même manière que `for..of`.
205
206
206
-
Donc, pour une chaine de caractères, `for..of` retourn des caractères et `...str` devient `"H","e","l","l","o"`. La liste de caractères est transmise à l'initialiseur de tableau `[...str]`.
207
+
Donc, pour une chaine de caractères, `for..of` retourne des caractères et `...str` devient `"H","e","l","l","o"`. La liste de caractères est transmise à l'initialiseur de tableau `[...str]`.
207
208
208
-
Pour cette tâche particulière, nous pourrions également utiliser `Array.from`, car il convertit un itérable (comme une chaîne de caractères) en un tableau :
209
+
Pour cette tâche particulière, nous pourrions également utiliser `Array.from`, car il convertit un itérable (comme une chaîne de caractères) en un tableau :
209
210
210
211
```js run
211
212
let str = "Hello";
@@ -223,10 +224,9 @@ Mais il existe une différence subtile entre `Array.from(obj)` et `[...obj]` :
223
224
224
225
Donc, pour transformer quelque chose en tableau, `Array.from` tend à être plus universel.
225
226
226
-
227
227
## Copier un tableau/objet
228
228
229
-
Souvenez-vous quand nous avons parlé de `Object.assign()` [par le passé](info:object-copy#cloning-and-merging-object-assign) ?
229
+
Vous souvenez-vous quand nous avons parlé de `Object.assign()` [par le passé](info:object-copy#cloning-and-merging-object-assign) ?
230
230
231
231
Il est possible de faire la même chose avec la syntaxe spread !
232
232
@@ -291,4 +291,4 @@ Modèles d'utilisation :
291
291
292
292
Ensemble, ils permettent de voyager facilement entre une liste et un tableau de paramètres.
293
293
294
-
Tous les arguments d'un appel de fonction sont également disponibles dans les `arguments` "à l'ancienne" : objet itérable array-like.
294
+
Tous les arguments d'un appel de fonction sont également disponibles dans la vriable `arguments` "à l'ancienne" : objet itérable array-like.
Copy file name to clipboardExpand all lines: 1-js/06-advanced-functions/03-closure/article.md
+18-18Lines changed: 18 additions & 18 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,12 +7,12 @@ Nous savons déjà qu'une fonction peut accéder à des variables en dehors de c
7
7
8
8
Mais que se passe-t-il si les variables externes changent depuis la création d'une fonction ? La fonction obtiendra-t-elle des valeurs plus récentes ou les anciennes ?
9
9
10
-
Et si une fonction est transmise en tant que paramètre et appelée depuis un autre endroit de code, aura-t-elle accès aux variables externes au nouvel endroit ?
10
+
Et si une fonction est transmise en tant que paramètre et appelée depuis un autre endroit du code, aura-t-elle accès aux variables externes au nouvel endroit ?
11
11
12
12
Développons maintenant nos connaissances pour inclure des scénarios plus complexes.
13
13
14
-
```smart header="Nous parlerons ici des variables `let/const`"
15
-
En JavaScript, il y a 3 façons de déclarer une variable: `let`, `const`(les modernes) et `var` (le vestige du passé).
14
+
```smart header="Nous parlerons ici des variables `let`/`const`"
15
+
En JavaScript, il y a 3 façons de déclarer une variable: `let`, `const`(les modernes) et `var` (le vestige du passé).
16
16
17
17
- Dans cet article, nous utiliserons des variables `let` dans les exemples.
18
18
- Les variables, déclarées avec `const`, se comportent de la même manière, donc cet article concerne également `const`.
@@ -81,7 +81,7 @@ if (true) {
81
81
alert(phrase); // Error, no such variable!
82
82
```
83
83
84
-
Here, after `if` finishes, the `alert`below won't see the`phrase`, hence the error.
84
+
Ici, après la fin du `if`, l'`alert`ci-dessous ne verra pas`phrase`, d'où l'erreur.
85
85
86
86
C'est super, car cela nous permet de créer des variables locales, spécifiques à une branche `if`.
87
87
@@ -96,13 +96,13 @@ for (let i = 0; i < 3; i++) {
96
96
alert(i); // Error, no such variable
97
97
```
98
98
99
-
Visually, `let i`is outside of `{...}`. But the `for`construct is special here: the variable, declared inside it, is considered a part of the block.
99
+
Visuellement, `let i`est à l'extérieur de `{...}`. Mais la construction de `for`est spéciale ici : la variable déclarée à l'intérieur est considérée comme faisant partie du bloc.
100
100
101
101
## Fonctions imbriquées
102
102
103
103
Une fonction est appelée "imbriquée" lorsqu'elle est créée dans une autre fonction.
104
104
105
-
Il est facilement possible de faire cela avec JavaScript.
105
+
Il est possible de faire cela facilement avec JavaScript.
106
106
107
107
Nous pouvons l'utiliser pour organiser notre code, comme ceci :
108
108
@@ -175,7 +175,7 @@ Dans ce code simple sans fonctions, il n'y a qu'un seul environnement lexical :
175
175
176
176
Il s'agit de l'environnement Lexical dit *global*, associé à l'ensemble du script.
177
177
178
-
Sur l'image ci-dessus, le rectangle signifie Environment Record(stockage de variable) et la flèche signifie la référence externe. L'environnement lexical global n'a pas de référence externe, c'est pourquoi la flèche pointe vers `null`.
178
+
Sur l'image ci-dessus, le rectangle signifie Environment Record(stockage de variable) et la flèche signifie la référence externe. L'environnement lexical global n'a pas de référence externe, c'est pourquoi la flèche pointe vers `null`.
179
179
180
180
À mesure que le code commence à s'exécuter et se poursuit, l'environnement lexical change.
181
181
@@ -189,7 +189,7 @@ Les rectangles sur le côté droit montrent comment l'environnement lexical glob
189
189
- Initialement, elles sont à l'état "non initialisé". C'est un état interne spécial, cela signifie que le moteur connaît la variable, mais elle ne peut pas être référencée tant qu'elle n'a pas été déclarée avec `let`. C'est presque la même chose que si la variable n'existait pas.
190
190
2. Ensuite, la définition de `let phrase` apparaît. Il n'y a pas encore d'affectation, donc sa valeur est `undefined`. Nous pouvons utiliser la variable depuis ce moment.
191
191
3.`phrase` se voit attribuer une valeur.
192
-
4.`phrase` change la valeur.
192
+
4.`phrase` change de valeur.
193
193
194
194
Tout semble simple pour l'instant, non ?
195
195
@@ -199,7 +199,8 @@ Tout semble simple pour l'instant, non ?
199
199
```smart header="L'environnement lexical est un objet de spécification"
200
200
"L'environnement lexical" est un objet de spécification : il n'existe que "théoriquement" dans la [spécification du language](https://tc39.es/ecma262/#sec-lexical-environments) pour décrire comment les choses fonctionnent. nous ne pouvons pas obtenir cet objet dans notre code et le manipuler directement.
201
201
202
-
JavaScript engines also may optimize it, discard variables that are unused to save memory and perform other internal tricks, as long as the visible behavior remains as described.
202
+
Les moteurs JavaScript peuvent également l'optimiser, supprimer les variables inutilisées pour économiser de la mémoire et effectuer d'autres opérations internes, tant que le comportement visible reste conforme à la description.
203
+
203
204
```
204
205
205
206
### Step 2. Fonctions Declarations
@@ -237,12 +238,12 @@ Par exemple, pour `say("John")`, cela ressemble à ceci (l'exécution est à la
237
238
238
239

239
240
240
-
Pendant l'appel de la fonction, nous avons deux environnements lexicaux : l'intérieur(pour l'appel de la fonction) et l'extérieur(global) :
241
+
Pendant l'appel de la fonction, nous avons deux environnements lexicaux : l'intérieur(pour l'appel de la fonction) et l'extérieur(global) :
241
242
242
-
- L'environnement lexical interne correspond à l'exécution actuelle de `say`. Il a une seule propriété: `nom`, l'argument de la fonction. Nous avons appelé `say("John")`, donc la valeur du`name` est `"John"`.
243
+
- L'environnement lexical interne correspond à l'exécution actuelle de `say`. Il a une seule propriété: `name`, l'argument de la fonction. Nous avons appelé `say("John")`, donc la valeur de`name` est `"John"`.
243
244
- L'environnement lexical externe est l'environnement lexical global. Il a la variable `phrase` et la fonction elle-même.
244
245
245
-
L'environnement lexical intérieur a une référence à l'environnement `outer`(extérieur).
246
+
L'environnement lexical intérieur a une référence à l'environnement `outer`(extérieur).
246
247
247
248
**Lorsque le code veut accéder à une variable - l'environnement lexical interne est recherché en premier, puis celui externe, puis le plus externe et ainsi de suite jusqu'à celui global.**
248
249
@@ -255,7 +256,6 @@ Dans cet exemple, la recherche se déroule comme ceci :
@@ -290,7 +290,7 @@ Plus tard, lorsque `counter()` est appelé, un nouvel environnement lexical est
290
290
291
291

292
292
293
-
Maintenant, lorsque le code à l'intérieur de `counter()` recherche la variable `count`, il recherche d'abord son propre environnement lexical (vide, car il n'y a pas de variables locales), puis l'environnement lexical de l'appel externe `makeCounter()`, où le trouve et change.
293
+
Maintenant, lorsque le code à l'intérieur de `counter()` recherche la variable `count`, il recherche d'abord son propre environnement lexical (vide, car il n'y a pas de variables locales), puis l'environnement lexical de l'appel externe `makeCounter()`, où il la trouve et la change.
294
294
295
295
**Une variable est mise à jour dans l'environnement lexical où elle se trouve.**
296
296
@@ -307,7 +307,7 @@ Une [closure](https://fr.wikipedia.org/wiki/Fermeture_(informatique)) est une fo
307
307
308
308
C'est-à-dire : elles se souviennent automatiquement de l'endroit où elles ont été créées en utilisant une propriété cachée `[[Environnement]]`, puis leur code peut accéder aux variables externes.
309
309
310
-
Lors d'un entretien d'embauche, un développeur frontend reçoit assez souvent une question du genre "qu'est-ce qu'une closure ?". Une réponse valide serait une définition de la closure ainsi qu'une explication sure le fait que toutes les fonctions en JavaScript sont des closures, et peut-être quelques mots de plus sur les détails techniques : la propriété `[[Environment]]` et comment fonctionnent les environnements lexicaux.
310
+
Lors d'un entretien d'embauche, un développeur frontend reçoit assez souvent une question du genre "qu'est-ce qu'une closure ?". Une réponse valide serait une définition de la closure ainsi qu'une explication sur le fait que toutes les fonctions en JavaScript sont des closures, et peut-être quelques mots de plus sur les détails techniques : la propriété `[[Environment]]` et comment fonctionnent les environnements lexicaux.
311
311
```
312
312
313
313
## Garbage collection
@@ -333,7 +333,7 @@ let g = f(); // g.[[Environment]] stocke une référence à l'environnement lexi
333
333
// de l'appel f() correspondant
334
334
```
335
335
336
-
veuillez noter que si `f()` est appelé plusieurs fois et que les fonctions résultantes sont sauvegardées, tous les objets d'environnement lexicaux correspondants seront également conservés en mémoire. tous les 3 dans le code ci-dessous :
336
+
Veuillez noter que si `f()` est appelé plusieurs fois et que les fonctions résultantes sont sauvegardées, tous les objets correspondants de l'environnement lexical seront également conservés en mémoire. Dans le code ci-dessous, ils sont tous les trois :
337
337
338
338
```js
339
339
functionf() {
@@ -347,7 +347,7 @@ function f() {
347
347
let arr = [f(), f(), f()];
348
348
```
349
349
350
-
un objet environnement lexical meurt lorsqu'il devient inaccessible (comme tout autre objet). en d'autres termes, il n'existe que s'il existe au moins une fonction imbriquée qui le référence.
350
+
Un objet environnement lexical meurt lorsqu'il devient inaccessible (comme tout autre objet). En d'autres termes, il n'existe que s'il existe au moins une fonction imbriquée qui le référence.
351
351
352
352
Dans le code ci-dessous, une fois que la fonction imbriquée est supprimée, son environnement lexical englobant (et donc la `value`) est nettoyé de la mémoire :
353
353
@@ -392,7 +392,7 @@ let g = f();
392
392
g();
393
393
```
394
394
395
-
Comme vous avez pu le constater, cette variable n'existe pas! En théorie, elle devrait être accessible, mais le moteur l'a optimisé.
395
+
Comme vous avez pu le constater, cette variable n'existe pas! En théorie, elle devrait être accessible, mais le moteur l'a optimisée.
396
396
397
397
Cela peut conduire à des problèmes de débogage amusants (voire fastidieux). L'un d'eux -- nous pouvons voir une variable externe portant le même nom au lieu de celle attendue :
Copy file name to clipboardExpand all lines: 1-js/06-advanced-functions/04-var/article.md
+9-9Lines changed: 9 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -30,7 +30,7 @@ D'un autre côté, il est important de comprendre les différences lors de la mi
30
30
31
31
Les variables, déclarées avec `var`, ont une portée fonction ou globale. Ils sont visibles à travers des blocs.
32
32
33
-
Par exemple:
33
+
Par exemple:
34
34
35
35
```js run
36
36
if (true) {
@@ -44,7 +44,7 @@ alert(test); // vrai, la variable existe après if
44
44
45
45
Comme `var` ignore les blocs de code, nous avons une variable globale `test`.
46
46
47
-
Si nous aurions utilisé `let test` au lieu de `var test`, la variable aurait seulement été visible à l'intérieur de `if`:
47
+
Si nous aurions utilisé `let test` au lieu de `var test`, la variable aurait seulement été visible à l'intérieur de `if`:
48
48
49
49
```js run
50
50
if (true) {
@@ -56,7 +56,7 @@ alert(test); // ReferenceError: test is not defined
56
56
*/!*
57
57
```
58
58
59
-
Même principe pour les boucles: `var` ne peut pas être locale pour les blocs ni les boucles :
59
+
Même principe pour les boucles: `var` ne peut pas être locale pour les blocs ni les boucles :
60
60
61
61
```js
62
62
for (var i =0; i <10; i++) {
@@ -113,7 +113,7 @@ Les déclarations `var` sont traitées quand la fonction commence (ou quand le s
113
113
114
114
En d'autres mots, les variables `var` sont définies au début de la fonction, peu importe où la définition se retrouve (présumant que la définition n'est pas dans une fonction imbriquée).
115
115
116
-
Alors ce code:
116
+
Alors ce code:
117
117
118
118
```js run
119
119
functionsayHi() {
@@ -128,7 +128,7 @@ function sayHi() {
128
128
sayHi();
129
129
```
130
130
131
-
...est techniquement identique à ceci (nous avons simplement bougé `var phrase` du code juste avant):
131
+
...est techniquement identique à ceci (nous avons simplement bougé `var phrase` du code juste avant):
132
132
133
133
```js run
134
134
functionsayHi() {
@@ -143,7 +143,7 @@ function sayHi() {
143
143
sayHi();
144
144
```
145
145
146
-
...ou même ceci (souvenez-vous, les blocs de code sont ignorés):
146
+
...ou même ceci (souvenez-vous, les blocs de code sont ignorés):
147
147
148
148
```js run
149
149
functionsayHi() {
@@ -162,15 +162,15 @@ sayHi();
162
162
163
163
Certains nomment ce comportement "hoisting" (hisser) parce que toutes les `var` sont "hoisted" (hissées) jusqu'en haut de la fonction.
164
164
165
-
Alors dans l'exemple au dessus, la branche `if (false)`n'est jamais exécutée, mais ce n'est pas grave. La `var`à l'intérieur de cette branche est traitée au début de la fonction, alors au moment `(*)`, la variable existe.
165
+
Ainsi, dans l'exemple ci-dessus, la branche `if (false)`ne s'exécute jamais, mais cela n'a pas d'importance. La `var`qu'elle contient est traitée au début de la fonction, donc au moment de `(*)` la variable existe.
166
166
167
167
**Les déclarations sont hissées, mais les affectations ne le sont pas.**
168
168
169
169
Cela est mieux démontré avec un exemple :
170
170
171
171
```js run
172
172
functionsayHi() {
173
-
alert(phrase);
173
+
alert(phrase);
174
174
175
175
*!*
176
176
var phrase ="Hello";
@@ -277,7 +277,7 @@ Dans tous les cas ci-dessus, nous déclarons une fonction expression et l'exécu
277
277
278
278
## Résumé
279
279
280
-
Il y a deux différences majeures entre `var` et `let/const`:
280
+
Il y a deux différences majeures entre `var` et `let`/`const`:
281
281
282
282
1. Les variables `var` n'ont pas de portée de bloc, leur visibilité est étendue à la fonction actuelle, ou globale, si elle est déclarée hors fonction.
283
283
2. Les déclarations `var` sont traitées au début de la fonction (ou au début du script pour le cas global).
0 commit comments