Skip to content

Commit ab831aa

Browse files
Apply many improvements in '1-js/06-advanced-functions/06-function-object/article.md'
1 parent 0c0ace4 commit ab831aa

File tree

1 file changed

+36
-37
lines changed
  • 1-js/06-advanced-functions/06-function-object

1 file changed

+36
-37
lines changed

1-js/06-advanced-functions/06-function-object/article.md

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,15 @@
33

44
Comme nous le savons déjà, une fonction en JavaScript est une valeur.
55

6-
Chaque valeur en JavaScript a un type. Quel type est une fonction?
6+
Chaque valeur en JavaScript a un type. De quel type est une fonction ?
77

88
Pour JavaScript, les fonctions sont des objets.
99

10-
Un bon moyen d’imaginer des fonctions est en tant que des "objets d’action" qu'on peut appeler. Nous pouvons non seulement les appeler, mais aussi les traiter comme des objets: ajouter/supprimer des propriétés, passer par référence, etc.
10+
Un bon moyen d’imaginer des fonctions est en tant que des "objets d’action" qu'on peut appeler. Nous pouvons non seulement les appeler, mais aussi les traiter comme des objets : ajouter/supprimer des propriétés, passer par référence, etc.
1111

1212
## La propriété "name"
1313

14-
Les objets Function contiennent quelques propriétés utilisables.
15-
16-
Les objets fonction contiennent des propriétés utilisables.
14+
Les objets Fonction contiennent des propriétés utilisables.
1715

1816
Par exemple, le nom d'une fonction est accessible en tant que propriété "name" :
1917

@@ -32,22 +30,22 @@ let sayHi = function() {
3230
alert("Hi");
3331
};
3432

35-
alert(sayHi.name); // sayHi (il y a un nom!)
33+
alert(sayHi.name); // sayHi (il y a un nom !)
3634
```
3735

38-
Cela fonctionne aussi si l’affectation est faite avec une valeur par défaut:
36+
Cela fonctionne aussi si l’affectation est faite avec une valeur par défaut :
3937

4038
```js run
4139
function f(sayHi = function() {}) {
42-
alert(sayHi.name); // sayHi (ça marche!)
40+
alert(sayHi.name); // sayHi (ça marche !)
4341
}
4442

4543
f();
4644
```
4745

48-
Dans la spécification, cette fonctionnalité est appelée "contextual name". Si la fonction n'en fournit pas, alors dans l'affectation elle est extraite du contexte.
46+
Dans la spécification, cette fonctionnalité est appelée "contextual name". Si la fonction n'en fournit pas, elle est déterminée à partir du contexte lors de l'affectation.
4947

50-
Les méthodes d'objet ont aussi des noms:
48+
Les méthodes d'objet ont aussi des noms :
5149

5250
```js run
5351
let user = {
@@ -66,7 +64,7 @@ alert(user.sayHi.name); // sayHi
6664
alert(user.sayBye.name); // sayBye
6765
```
6866

69-
Cependant c'est pas magique. Il y a des cas où il n'y a aucun moyen de trouver le bon nom. Dans ce cas, la propriété name est vide, comme ci-dessous:
67+
Cependant c'est pas magique. Il y a des cas où il n'y a aucun moyen de trouver le bon nom. Dans ce cas, la propriété name est vide, comme ci-dessous :
7068

7169
```js
7270
// fonction créée dans un tableau
@@ -80,7 +78,7 @@ Par contre, en pratique la plupart des fonctions ont un nom.
8078

8179
## La propriété "length"
8280

83-
Il existe une autre propriété native, "length", qui renvoie le nombre de paramètres de la fonction, par exemple:
81+
Il existe une autre propriété native, "length", qui renvoie le nombre de paramètres de la fonction, par exemple :
8482

8583
```js run
8684
function f1(a) {}
@@ -98,7 +96,7 @@ La propriété `length` est parfois utilisée pour la [réfléxion (introspectio
9896

9997
Par exemple, dans le code ci-dessous, la fonction `ask` accepte une `question` à poser et un nombre arbitraire de fonctions `handler` (gestionnaires) à appeler.
10098

101-
Une fois qu'un utilisateur a fourni sa réponse, la fonction appelle les gestionnaires. Nous pouvons transmettre deux types de gestionnaires:
99+
Une fois qu'un utilisateur a fourni sa réponse, la fonction appelle les gestionnaires. Nous pouvons transmettre deux types de gestionnaires :
102100

103101
- Une fonction sans argument, qui n'est appelée que lorsque l'utilisateur donne une réponse positive.
104102
- Une fonction avec des arguments, appelée dans les deux cas et renvoyant une réponse.
@@ -122,17 +120,17 @@ function ask(question, ...handlers) {
122120
}
123121

124122
// pour une réponse positive, les deux gestionnaires sont appelés
125-
// pour réponse négative, seulement le second
123+
// pour une réponse négative, seulement le second
126124
ask("Question?", () => alert('You said yes'), result => alert(result));
127125
```
128126

129-
Ceci est un cas particulier de ce qu'on appelle [polymorphism](https://en.wikipedia.org/wiki/Polymorphism_(computer_science)) -- le traitement des arguments différemment selon leur type ou, dans notre cas, en fonction de la `length`. L'idée a une utilisation dans les bibliothèques JavaScript.
127+
Ceci est un cas particulier de ce qu'on appelle le [polymorphism](https://en.wikipedia.org/wiki/Polymorphism_(computer_science)) -- le traitement des arguments différemment selon leur type ou, dans notre cas, en fonction de la `length`. Cette approche est utilisée dans les bibliothèques JavaScript.
130128

131129
## Propriétés personnalisées
132130

133131
Nous pouvons également ajouter nos propres propriétés.
134132

135-
Nous ajoutons ici la propriété `counter` pour suivre le nombre total d'appels:
133+
Nous ajoutons ici la propriété `counter` pour suivre le nombre total d'appels :
136134

137135
```js run
138136
function sayHi() {
@@ -156,11 +154,12 @@ Une propriété affectée à une fonction comme `sayHi.counter = 0` *ne définit
156154
157155
On peut traiter une fonction comme un objet, y stocker des propriétés, mais cela n’a aucun effet sur son exécution. Les variables ne sont pas des propriétés de fonction et inversement. Ce sont des mondes parallèles.
158156
```
159-
Les propriétés de fonction peuvent parfois remplacer les fermetures. Par exemple, nous pouvons réécrire l’exemple de fonction de compteur du chapitre <info:fermeture> pour utiliser une propriété de fonction:
157+
158+
Les propriétés de fonction peuvent parfois remplacer les fermetures. Par exemple, nous pouvons réécrire l’exemple de fonction de compteur du chapitre <info:closure> pour utiliser une propriété de fonction :
160159

161160
```js run
162161
function makeCounter() {
163-
// au lieu de:
162+
// au lieu de :
164163
// let count = 0
165164

166165
function counter() {
@@ -177,11 +176,11 @@ alert( counter() ); // 0
177176
alert( counter() ); // 1
178177
```
179178

180-
Le `count` est maintenant stocké dans la fonction directement, pas dans son environnement lexical externe
179+
Le `count` est maintenant stocké dans la fonction directement, pas dans son environnement lexical externe.
181180

182-
Est-ce meilleur ou pire que d'utiliser une fermeture?
181+
Est-ce meilleur ou pire que d'utiliser une fermeture ?
183182

184-
La principale différence est que si la valeur de `count` réside dans une variable externe, le code externe ne peut pas y accéder. Seules les fonctions imbriquées peuvent le modifier. Et si c'est lié à une fonction, une telle chose est possible:
183+
La principale différence est que si la valeur de `count` réside dans une variable externe, le code externe ne peut pas y accéder. Seules les fonctions imbriquées peuvent le modifier. Et si c'est lié à une fonction, une telle chose est possible :
185184

186185
```js run
187186
function makeCounter() {
@@ -217,21 +216,21 @@ let sayHi = function(who) {
217216
};
218217
```
219218

220-
Et ajoutons un nom à cela:
219+
Et ajoutons un nom à cela :
221220

222221
```js
223222
let sayHi = function *!*func*/!*(who) {
224223
alert(`Hello, ${who}`);
225224
};
226225
```
227226

228-
Avons-nous réalisé quelque chose ici? Quel est le but de ce nom supplémentaire `"func"`?
227+
Avons-nous réalisé quelque chose ici ? Quel est le but de ce nom supplémentaire `"func"` ?
229228

230229
Notons d'abord que nous avons toujours une expression de fonction. L'ajout du nom `"func"` après `function` n'en a pas fait une déclaration de fonction, car il est toujours créé dans le cadre d'une expression d'affectation.
231230

232231
L'ajout d'un tel nom n'a également rien cassé.
233232

234-
La fonction est toujours disponible sous la forme `sayHi()`:
233+
La fonction est toujours disponible sous la forme `sayHi()` :
235234

236235
```js run
237236
let sayHi = function *!*func*/!*(who) {
@@ -241,12 +240,12 @@ let sayHi = function *!*func*/!*(who) {
241240
sayHi("John"); // Hello, John
242241
```
243242

244-
Il y a deux particularités à propos du nom `func`, voici les raisons :
243+
Il y a deux particularités à propos du nom `func`, voici les raisons :
245244

246245
1. Il permet à la fonction de se référencer en interne.
247246
2. Il n'est pas visible en dehors de la fonction.
248247

249-
Par exemple, la fonction `sayHi` ci-dessous s’appelle à nouveau avec `"Guest"` si aucun `who` est fourni:
248+
Par exemple, la fonction `sayHi` ci-dessous s’appelle à nouveau avec `"Guest"` si aucun `who` est fourni :
250249

251250
```js run
252251
let sayHi = function *!*func*/!*(who) {
@@ -261,14 +260,13 @@ let sayHi = function *!*func*/!*(who) {
261260

262261
sayHi(); // Hello, Guest
263262

264-
// Mais ceci ne marchera pas:
263+
// Mais ceci ne marchera pas :
265264
func(); // Error, func is not defined (pas visible à l'extérieur de la fonction)
266265
```
267266

268-
Pourquoi utilisons-nous `func`? Peut-être juste utiliser `sayHi` pour l'appel imbriqué?
269-
267+
Pourquoi utilisons-nous `func` ? Peut-être juste utiliser `sayHi` pour l'appel imbriqué ?
270268

271-
En fait, dans la plupart des cas, nous pouvons:
269+
En fait, dans la plupart des cas, nous pouvons :
272270

273271
```js
274272
let sayHi = function(who) {
@@ -298,14 +296,14 @@ let sayHi = function(who) {
298296
let welcome = sayHi;
299297
sayHi = null;
300298

301-
welcome(); // Error, l'appel sayHi imbriqué ne fonctionne plus!
299+
welcome(); // Error, l'appel sayHi imbriqué ne fonctionne plus !
302300
```
303301

304-
Cela se produit parce que la fonction tire `sayHi` de son environnement lexical externe. Il n'y a pas de `sayHi` local, donc la variable externe est utilisée. Et au moment de l'appel, cet `sayHi` extérieur est `null`.
302+
Cela se produit parce que la fonction tire `sayHi` de son environnement lexical externe. Il n'y a pas de `sayHi` local, donc la variable externe est utilisée. Et au moment de l'appel, ce `sayHi` extérieur est `null`.
305303

306304
Le nom optionnel que nous pouvons mettre dans l’expression de fonction est destiné à résoudre exactement ce type de problèmes.
307305

308-
Utilisons-le pour corriger notre code:
306+
Utilisons-le pour corriger notre code :
309307

310308
```js run
311309
let sayHi = function *!*func*/!*(who) {
@@ -331,21 +329,22 @@ Le code externe a toujours sa variable `sayHi` ou `welcome`. Et `func` est un "n
331329
```smart header="Il n'y a rien de tel pour la déclaration de fonction"
332330
La fonctionnalité "nom interne" décrite ici n'est disponible que pour les expressions de fonction, pas pour les déclarations de fonction. Pour les déclarations de fonctions, il n’y a aucune possibilité de syntaxe d’ajouter un nom "interne" supplémentaire.
333331
334-
Parfois, lorsque nous avons besoin d’un nom interne fiable, c’est la raison pour laquelle nous réécrivons une déclaration de fonction en tant qe'expression de fonction nommée.
332+
Parfois, lorsque nous avons besoin d’un nom interne fiable, c’est la raison pour laquelle nous réécrivons une déclaration de fonction en tant qu'expression de fonction nommée.
335333
```
336334

337335
## Résumé
338336

339337
Les fonctions sont des objets.
340338

341-
Ici nous avons couvert leurs propriétés:
339+
Ici nous avons couvert leurs propriétés :
342340

343341
- `name` - le nom de la fonction. Habituellement tiré de la définition de la fonction, mais s’il n’en existe pas, JavaScript essaie de le deviner à partir du contexte (par exemple, une affectation).
344342
- `length` - le nombre d'arguments dans la définition de la fonction. Les paramètres du reste ne sont pas comptés.
345343

346-
Si la fonction est déclarée en tant qu'expression de fonction (et non dans le flux du code principal) et qu'elle porte `name`, elle est appelée expression de fonction nommée. Le nom peut être utilisé à l'intérieur pour se référencer, pour des appels récursifs ou autres.
344+
Si la fonction est déclarée en tant qu'expression de fonction (et non dans le flux du code principal) et qu'elle porte un nom, elle est appelée expression de fonction nommée. Le nom peut être utilisé à l'intérieur pour se référencer, pour des appels récursifs ou autres.
347345

346+
Les fonctions peuvent également comporter des propriétés supplémentaires. De nombreuses bibliothèques JavaScript bien connues font un grand usage de cette fonctionnalité.
348347

349-
Ils créent une fonction "principale" et y attachent de nombreuses autres fonctions "d'assistance". Par exemple, la bibliothèque [jquery](https://jquery.com) crée une fonction nommée `$`. La bibliothèque [lodash](https://lodash.com) crée une fonction `_`. Et ajoute ensuite `_.clone`,` _.keyBy` et d'autres propriétés (voir la [doc](https://lodash.com/docs) lorsque vous souhaitez en savoir plus à leur sujet). En fait, elles le font pour réduire leur pollution de l'espace global, de sorte qu'une seule bibliothèque ne donne qu'une seule variable globale. Cela réduit la possibilité de conflits de noms.
348+
Elles créent une fonction "principale" et y attachent de nombreuses autres fonctions "d'assistance". Par exemple, la bibliothèque [jQuery](https://jquery.com) crée une fonction nommée `$`. La bibliothèque [lodash](https://lodash.com) crée une fonction `_` et ajoute ensuite `_.clone`, `_.keyBy` et d'autres propriétés (voir la [doc](https://lodash.com/docs) lorsque vous souhaitez en savoir plus à leur sujet). En fait, elles le font pour réduire leur pollution de l'espace global, de sorte qu'une seule bibliothèque ne donne qu'une seule variable globale. Cela réduit la possibilité de conflits de noms.
350349

351350
Ainsi, une fonction peut faire un travail utile par elle-même et aussi porter un tas d’autres fonctionnalités dans les propriétés.

0 commit comments

Comments
 (0)