Skip to content

Commit 02df404

Browse files
authored
Merge pull request #454 from ArmandDelessert/patch-1-js-06-advanced-functions
Apporte plusieurs corrections au chapitre 1.6 (Advanced Functions)
2 parents c2402b6 + ca30774 commit 02df404

File tree

9 files changed

+131
-131
lines changed

9 files changed

+131
-131
lines changed

1-js/06-advanced-functions/02-rest-parameters-spread/article.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@ Par exemple :
88
- `Object.assign(dest, src1, ..., srcN)` -- copie les propriétés de `src1..N` dans `dest`.
99
- ... etc.
1010

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.
1212

1313
## Les paramètres Rest `...`
1414

1515
Une fonction peut être appelée avec un nombre quelconque d'arguments, peu importe comment elle a été définie.
1616

1717
Comme ici :
18+
1819
```js run
1920
function sum(a, b) {
2021
return a + b;
@@ -96,9 +97,9 @@ showName("Julius", "Caesar");
9697
showName("Ilya");
9798
```
9899

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.
100101

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.
102103

103104
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.
104105

@@ -147,7 +148,7 @@ alert( Math.max(arr) ); // NaN
147148
148149
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.
149150
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.
151152
152153
Quand `...arr` est utilisé dans l'appel de fonction, il "développe" un objet itérable `arr` dans la liste des arguments.
153154
@@ -203,9 +204,9 @@ alert( [...str] ); // H,e,l,l,o
203204
204205
La syntaxe spread utilise en interne des itérateurs pour rassembler les éléments, de la même manière que `for..of`.
205206
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]`.
207208
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 :
209210
210211
```js run
211212
let str = "Hello";
@@ -223,10 +224,9 @@ Mais il existe une différence subtile entre `Array.from(obj)` et `[...obj]` :
223224
224225
Donc, pour transformer quelque chose en tableau, `Array.from` tend à être plus universel.
225226
226-
227227
## Copier un tableau/objet
228228
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) ?
230230
231231
Il est possible de faire la même chose avec la syntaxe spread !
232232
@@ -291,4 +291,4 @@ Modèles d'utilisation :
291291
292292
Ensemble, ils permettent de voyager facilement entre une liste et un tableau de paramètres.
293293
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.

1-js/06-advanced-functions/03-closure/article.md

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ Nous savons déjà qu'une fonction peut accéder à des variables en dehors de c
77

88
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 ?
99

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 ?
1111

1212
Développons maintenant nos connaissances pour inclure des scénarios plus complexes.
1313

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é).
1616

1717
- Dans cet article, nous utiliserons des variables `let` dans les exemples.
1818
- 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) {
8181
alert(phrase); // Error, no such variable!
8282
```
8383

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.
8585

8686
C'est super, car cela nous permet de créer des variables locales, spécifiques à une branche `if`.
8787

@@ -96,13 +96,13 @@ for (let i = 0; i < 3; i++) {
9696
alert(i); // Error, no such variable
9797
```
9898

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.
100100

101101
## Fonctions imbriquées
102102

103103
Une fonction est appelée "imbriquée" lorsqu'elle est créée dans une autre fonction.
104104

105-
Il est facilement possible de faire cela avec JavaScript.
105+
Il est possible de faire cela facilement avec JavaScript.
106106

107107
Nous pouvons l'utiliser pour organiser notre code, comme ceci :
108108

@@ -175,7 +175,7 @@ Dans ce code simple sans fonctions, il n'y a qu'un seul environnement lexical :
175175

176176
Il s'agit de l'environnement Lexical dit *global*, associé à l'ensemble du script.
177177

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`.
179179

180180
À mesure que le code commence à s'exécuter et se poursuit, l'environnement lexical change.
181181

@@ -189,7 +189,7 @@ Les rectangles sur le côté droit montrent comment l'environnement lexical glob
189189
- 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.
190190
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.
191191
3. `phrase` se voit attribuer une valeur.
192-
4. `phrase` change la valeur.
192+
4. `phrase` change de valeur.
193193

194194
Tout semble simple pour l'instant, non ?
195195

@@ -199,7 +199,8 @@ Tout semble simple pour l'instant, non ?
199199
```smart header="L'environnement lexical est un objet de spécification"
200200
"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.
201201
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+
203204
```
204205

205206
### Step 2. Fonctions Declarations
@@ -237,12 +238,12 @@ Par exemple, pour `say("John")`, cela ressemble à ceci (l'exécution est à la
237238

238239
![](lexical-environment-simple.svg)
239240

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) :
241242

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"`.
243244
- L'environnement lexical externe est l'environnement lexical global. Il a la variable `phrase` et la fonction elle-même.
244245

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).
246247

247248
**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.**
248249

@@ -255,7 +256,6 @@ Dans cet exemple, la recherche se déroule comme ceci :
255256

256257
![lexical environment lookup](lexical-environment-simple-lookup.svg)
257258

258-
259259
### Step 4. Retourner une fonction
260260

261261
Revenons à l'exemple `makeCounter`.
@@ -290,7 +290,7 @@ Plus tard, lorsque `counter()` est appelé, un nouvel environnement lexical est
290290

291291
![](closure-makecounter-nested-call.svg)
292292

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.
294294

295295
**Une variable est mise à jour dans l'environnement lexical où elle se trouve.**
296296

@@ -307,7 +307,7 @@ Une [closure](https://fr.wikipedia.org/wiki/Fermeture_(informatique)) est une fo
307307
308308
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.
309309
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.
311311
```
312312

313313
## Garbage collection
@@ -333,7 +333,7 @@ let g = f(); // g.[[Environment]] stocke une référence à l'environnement lexi
333333
// de l'appel f() correspondant
334334
```
335335

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 :
337337

338338
```js
339339
function f() {
@@ -347,7 +347,7 @@ function f() {
347347
let arr = [f(), f(), f()];
348348
```
349349

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.
351351

352352
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 :
353353

@@ -392,7 +392,7 @@ let g = f();
392392
g();
393393
```
394394

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.
396396

397397
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 :
398398

1-js/06-advanced-functions/04-var/article.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ D'un autre côté, il est important de comprendre les différences lors de la mi
3030

3131
Les variables, déclarées avec `var`, ont une portée fonction ou globale. Ils sont visibles à travers des blocs.
3232

33-
Par exemple:
33+
Par exemple :
3434

3535
```js run
3636
if (true) {
@@ -44,7 +44,7 @@ alert(test); // vrai, la variable existe après if
4444

4545
Comme `var` ignore les blocs de code, nous avons une variable globale `test`.
4646

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` :
4848

4949
```js run
5050
if (true) {
@@ -56,7 +56,7 @@ alert(test); // ReferenceError: test is not defined
5656
*/!*
5757
```
5858

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 :
6060

6161
```js
6262
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
113113

114114
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).
115115

116-
Alors ce code:
116+
Alors ce code :
117117

118118
```js run
119119
function sayHi() {
@@ -128,7 +128,7 @@ function sayHi() {
128128
sayHi();
129129
```
130130

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) :
132132

133133
```js run
134134
function sayHi() {
@@ -143,7 +143,7 @@ function sayHi() {
143143
sayHi();
144144
```
145145

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) :
147147

148148
```js run
149149
function sayHi() {
@@ -162,15 +162,15 @@ sayHi();
162162

163163
Certains nomment ce comportement "hoisting" (hisser) parce que toutes les `var` sont "hoisted" (hissées) jusqu'en haut de la fonction.
164164

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.
166166

167167
**Les déclarations sont hissées, mais les affectations ne le sont pas.**
168168

169169
Cela est mieux démontré avec un exemple :
170170

171171
```js run
172172
function sayHi() {
173-
alert(phrase);
173+
alert(phrase);
174174

175175
*!*
176176
var phrase = "Hello";
@@ -277,7 +277,7 @@ Dans tous les cas ci-dessus, nous déclarons une fonction expression et l'exécu
277277

278278
## Résumé
279279

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`:
281281

282282
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.
283283
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

Comments
 (0)