Skip to content

Commit 41918e2

Browse files
committed
Translates "Function object, NFE" into French
1 parent 7d26472 commit 41918e2

File tree

1 file changed

+85
-88
lines changed
  • 1-js/06-advanced-functions/06-function-object

1 file changed

+85
-88
lines changed
Lines changed: 85 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11

2-
# Function object, NFE
2+
# L'objet Function, EFN
33

4-
As we already know, functions in JavaScript are values.
4+
Comme nous le savons déjà, les fonctions en JavaScript sont des valeurs.
55

6-
Every value in JavaScript has a type. What type is a function?
6+
Chaque valeur en JavaScript a un type. Quel type est une fonction?
77

8-
In JavaScript, functions are objects.
8+
Pour JavaScript, les fonctions sont des objets.
99

10-
A good way to imagine functions is as callable "action objects". We can not only call them, but also treat them as objects: add/remove properties, pass by reference 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

12+
## La propriété "name"
1213

13-
## The "name" property
14+
Les objets Function contiennent quelques propriétés utilisables.
1415

15-
Function objects contain a few useable properties.
16-
17-
For instance, a function's name is accessible as the "name" property:
16+
Par exemple, le nom d'une fonction est accessible en tant que propriété "name":
1817

1918
```js run
2019
function sayHi() {
@@ -23,30 +22,29 @@ function sayHi() {
2322

2423
alert(sayHi.name); // sayHi
2524
```
26-
27-
What's more funny, the name-assigning logic is smart. It also assigns the correct name to functions that are used in assignments:
25+
De plus, la logique d'attribution de nom est intelligente. Elle attribue également le nom correct aux fonctions utilisées dans les affectations:
2826

2927
```js run
3028
let sayHi = function() {
3129
alert("Hi");
3230
}
3331

34-
alert(sayHi.name); // sayHi (works!)
32+
alert(sayHi.name); // sayHi (ça marche!)
3533
```
3634

37-
It also works if the assignment is done via a default value:
35+
Cela fonctionne aussi si l’affectation est faite avec une valeur par défaut:
3836

3937
```js run
4038
function f(sayHi = function() {}) {
41-
alert(sayHi.name); // sayHi (works!)
39+
alert(sayHi.name); // sayHi (ça marche!)
4240
}
4341

4442
f();
4543
```
4644

47-
In the specification, this feature is called a "contextual name". If the function does not provide one, then in an assignment it is figured out from the context.
45+
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.
4846

49-
Object methods have names too:
47+
Les méthodes d'objet ont aussi des noms:
5048

5149
```js run
5250
let user = {
@@ -65,21 +63,21 @@ alert(user.sayHi.name); // sayHi
6563
alert(user.sayBye.name); // sayBye
6664
```
6765

68-
There's no magic though. There are cases when there's no way to figure out the right name. In that case, the name property is empty, like here:
66+
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:
6967

7068
```js
71-
// function created inside array
69+
// fonction créée dans un tableau
7270
let arr = [function() {}];
7371

74-
alert( arr[0].name ); // <empty string>
75-
// the engine has no way to set up the right name, so there is none
72+
alert( arr[0].name ); // <chaîne de caractères vide>
73+
// le moteur n'a aucun moyen de définir le bon nom. Donc, il n'y en a pas
7674
```
7775

78-
In practice, however, most functions do have a name.
76+
Par contre, en pratique la plupart des fonctions ont un nom.
7977

80-
## The "length" property
78+
## La propriété "length"
8179

82-
There is another built-in property "length" that returns the number of function parameters, for instance:
80+
Il existe une autre propriété native, "length", qui renvoie le nombre de paramètres de la fonction, par exemple:
8381

8482
```js run
8583
function f1(a) {}
@@ -91,20 +89,20 @@ alert(f2.length); // 2
9189
alert(many.length); // 2
9290
```
9391

94-
Here we can see that rest parameters are not counted.
92+
Nous pouvons voir que les paramètres du reste ne sont pas comptés.
9593

96-
The `length` property is sometimes used for introspection in functions that operate on other functions.
94+
La propriété `length` est parfois utilisée pour l'introspection dans des fonctions qui opèrent sur d'autres fonctions.
9795

98-
For instance, in the code below the `ask` function accepts a `question` to ask and an arbitrary number of `handler` functions to call.
96+
Par exemple, dans le code ci-dessous, la fonction `ask` accepte une `question` à poser et un nombre arbitraire de fonctions `handler` (gestionnaires) à appeler.
9997

100-
Once a user provides their answer, the function calls the handlers. We can pass two kinds of handlers:
98+
Une fois qu'un utilisateur a fourni sa réponse, la fonction appelle les gestionnaires. Nous pouvons transmettre deux types de gestionnaires:
10199

102-
- A zero-argument function, which is only called when the user gives a positive answer.
103-
- A function with arguments, which is called in either case and returns an answer.
100+
- Une fonction sans argument, qui n'est appelée que lorsque l'utilisateur donne une réponse positive.
101+
- Une fonction avec des arguments, appelée dans les deux cas et renvoyant une réponse.
104102

105-
The idea is that we have a simple, no-arguments handler syntax for positive cases (most frequent variant), but are able to provide universal handlers as well.
103+
L'idée est que nous avons une syntaxe de gestionnaire simple, sans argument, pour les cas positifs (variante la plus fréquente), mais que nous pouvons également fournir des gestionnaires universels.
106104

107-
To call `handlers` the right way, we examine the `length` property:
105+
Pour appeler `handlers` correctement, nous examinons la propriété `length`:
108106

109107
```js run
110108
function ask(question, ...handlers) {
@@ -120,47 +118,46 @@ function ask(question, ...handlers) {
120118

121119
}
122120

123-
// for positive answer, both handlers are called
124-
// for negative answer, only the second one
121+
// pour une réponse positive, les deux gestionnaires sont appelés
122+
// pour réponse négative, seulement le second
125123
ask("Question?", () => alert('You said yes'), result => alert(result));
126124
```
127125

128-
This is a particular case of so-called [polymorphism](https://en.wikipedia.org/wiki/Polymorphism_(computer_science)) -- treating arguments differently depending on their type or, in our case depending on the `length`. The idea does have a use in JavaScript libraries.
126+
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.
129127

130-
## Custom properties
128+
## Propriétés personnalisées
131129

132-
We can also add properties of our own.
130+
Nous pouvons également ajouter nos propres propriétés.
133131

134-
Here we add the `counter` property to track the total calls count:
132+
Nous ajoutons ici la propriété `counter` pour suivre le nombre total d'appels:
135133

136134
```js run
137135
function sayHi() {
138136
alert("Hi");
139137

140138
*!*
141-
// let's count how many times we run
139+
// comptons combien de fois nous executons
142140
sayHi.counter++;
143141
*/!*
144142
}
145-
sayHi.counter = 0; // initial value
143+
sayHi.counter = 0; // valeur initiale
146144

147145
sayHi(); // Hi
148146
sayHi(); // Hi
149147

150-
alert( `Called ${sayHi.counter} times` ); // Called 2 times
148+
alert( `Called ${sayHi.counter} times` ); // Appelée 2 fois
151149
```
152150

153-
```warn header="A property is not a variable"
154-
A property assigned to a function like `sayHi.counter = 0` does *not* define a local variable `counter` inside it. In other words, a property `counter` and a variable `let counter` are two unrelated things.
151+
```warn header="Une propriété n'est pas une variable"
152+
Une propriété affectée à une fonction comme `sayHi.counter = 0` *ne définit pas* une variable locale `counter` à l'intérieur de celle-ci. En d'autres termes, une propriété `counter` et une variable `let counter` sont deux choses indépendantes.
155153
156-
We can treat a function as an object, store properties in it, but that has no effect on its execution. Variables are not function properties and vice versa. These are just parallel worlds.
154+
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.
157155
```
158-
159-
Function properties can replace closures sometimes. For instance, we can rewrite the counter function example from the chapter <info:closure> to use a function property:
156+
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:
160157

161158
```js run
162159
function makeCounter() {
163-
// instead of:
160+
// au lieu de:
164161
// let count = 0
165162

166163
function counter() {
@@ -177,11 +174,11 @@ alert( counter() ); // 0
177174
alert( counter() ); // 1
178175
```
179176

180-
The `count` is now stored in the function directly, not in its outer Lexical Environment.
177+
Le `count` est maintenant stocké dans la fonction directement, pas dans son environnement lexical externe
181178

182-
Is it better or worse than using a closure?
179+
Est-ce meilleur ou pire que d'utiliser une fermeture?
183180

184-
The main difference is that if the value of `count` lives in an outer variable, then external code is unable to access it. Only nested functions may modify it. And if it's bound to a function, then such a thing is possible:
181+
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:
185182

186183
```js run
187184
function makeCounter() {
@@ -203,35 +200,35 @@ alert( counter() ); // 10
203200
*/!*
204201
```
205202

206-
So the choice of implementation depends on our aims.
203+
Le choix dépend donc de nos objectifs.
207204

208-
## Named Function Expression
205+
## Expression de fonction nommée
209206

210-
Named Function Expression, or NFE, is a term for Function Expressions that have a name.
207+
Expression de fonction nommée, ou EFN, est un terme pour les expressions de fonction qui ont un nom.
211208

212-
For instance, let's take an ordinary Function Expression:
209+
Par exemple, prenons une expression de fonction ordinaire:
213210

214211
```js
215212
let sayHi = function(who) {
216213
alert(`Hello, ${who}`);
217214
};
218215
```
219216

220-
And add a name to it:
217+
Et ajoutons un nom à cela:
221218

222219
```js
223220
let sayHi = function *!*func*/!*(who) {
224221
alert(`Hello, ${who}`);
225222
};
226223
```
227224

228-
Did we achieve anything here? What's the purpose of that additional `"func"` name?
225+
Avons-nous réalisé quelque chose ici? Quel est le but de ce nom supplémentaire `"func"`?
229226

230-
First let's note, that we still have a Function Expression. Adding the name `"func"` after `function` did not make it a Function Declaration, because it is still created as a part of an assignment expression.
227+
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.
231228

232-
Adding such a name also did not break anything.
229+
L'ajout d'un tel nom n'a également rien cassé.
233230

234-
The function is still available as `sayHi()`:
231+
La fonction est toujours disponible sous la forme `sayHi()`:
235232

236233
```js run
237234
let sayHi = function *!*func*/!*(who) {
@@ -241,34 +238,34 @@ let sayHi = function *!*func*/!*(who) {
241238
sayHi("John"); // Hello, John
242239
```
243240

244-
There are two special things about the name `func`:
241+
Le nom `func` a deux particularités:
245242

246-
1. It allows the function to reference itself internally.
247-
2. It is not visible outside of the function.
243+
1. Il permet à la fonction de se référencer en interne.
244+
2. Il n'est pas visible en dehors de la fonction.
248245

249-
For instance, the function `sayHi` below calls itself again with `"Guest"` if no `who` is provided:
246+
Par exemple, la fonction `sayHi` ci-dessous s’appelle à nouveau avec `"Guest"` si aucun `who` est fourni:
250247

251248
```js run
252249
let sayHi = function *!*func*/!*(who) {
253250
if (who) {
254251
alert(`Hello, ${who}`);
255252
} else {
256253
*!*
257-
func("Guest"); // use func to re-call itself
254+
func("Guest"); // utilise func pour se rappeler
258255
*/!*
259256
}
260257
};
261258

262259
sayHi(); // Hello, Guest
263260

264-
// But this won't work:
265-
func(); // Error, func is not defined (not visible outside of the function)
261+
// Mais ceci ne marchera pas:
262+
func(); // Error, func is not defined (pas visible à l'extérieur de la fonction)
266263
```
267264

268-
Why do we use `func`? Maybe just use `sayHi` for the nested call?
265+
Pourquoi utilisons-nous `func`? Peut-être juste utiliser `sayHi` pour l'appel imbriqué?
269266

270267

271-
Actually, in most cases we can:
268+
En fait, dans la plupart des cas, nous pouvons:
272269

273270
```js
274271
let sayHi = function(who) {
@@ -282,7 +279,7 @@ let sayHi = function(who) {
282279
};
283280
```
284281

285-
The problem with that code is that the value of `sayHi` may change. The function may go to another variable, and the code will start to give errors:
282+
Le problème avec ce code est que la valeur de `sayHi` peut changer. La fonction peut aller à une autre variable et le code va commencer à donner des erreurs:
286283

287284
```js run
288285
let sayHi = function(who) {
@@ -298,55 +295,55 @@ let sayHi = function(who) {
298295
let welcome = sayHi;
299296
sayHi = null;
300297

301-
welcome(); // Error, the nested sayHi call doesn't work any more!
298+
welcome(); // Error, l'appel sayHi imbriqué ne fonctionne plus!
302299
```
303300

304-
That happens because the function takes `sayHi` from its outer lexical environment. There's no local `sayHi`, so the outer variable is used. And at the moment of the call that outer `sayHi` is `null`.
301+
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`.
305302

306-
The optional name which we can put into the Function Expression is meant to solve exactly these kinds of problems.
303+
Le nom optionnel que nous pouvons mettre dans l’expression de fonction est destiné à résoudre exactement ce type de problèmes.
307304

308-
Let's use it to fix our code:
305+
Utilisons-le pour corriger notre code:
309306

310307
```js run
311308
let sayHi = function *!*func*/!*(who) {
312309
if (who) {
313310
alert(`Hello, ${who}`);
314311
} else {
315312
*!*
316-
func("Guest"); // Now all fine
313+
func("Guest"); // Maintenant tout va bien
317314
*/!*
318315
}
319316
};
320317

321318
let welcome = sayHi;
322319
sayHi = null;
323320

324-
welcome(); // Hello, Guest (nested call works)
321+
welcome(); // Hello, Guest (l'appel imbriqué fonctionne)
325322
```
326323

327-
Now it works, because the name `"func"` is function-local. It is not taken from outside (and not visible there). The specification guarantees that it will always reference the current function.
324+
Maintenant cela fonctionne, car le nom `'func'` est local à la fonction. Il n'est pas pris de l'extérieur (et non visible là-bas). La spécification garantit qu'elle fera toujours référence à la fonction actuelle.
328325

329-
The outer code still has it's variable `sayHi` or `welcome`. And `func` is an "internal function name", how the function can call itself internally.
326+
Le code externe a toujours sa variable `sayHi` ou `welcome`. Et `func` est un "nom de fonction interne", c'est comment la fonction peut s'appeler en interne.
330327

331-
```smart header="There's no such thing for Function Declaration"
332-
The "internal name" feature described here is only available for Function Expressions, not to Function Declarations. For Function Declarations, there's just no syntax possibility to add a one more "internal" name.
328+
```smart header="Il n'y a rien de tel pour la déclaration de fonction"
329+
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.
333330
334-
Sometimes, when we need a reliable internal name, it's the reason to rewrite a Function Declaration to Named Function Expression form.
331+
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.
335332
```
336333

337-
## Summary
334+
## Résumé
338335

339-
Functions are objects.
336+
Les fonctions sont des objets.
340337

341-
Here we covered their properties:
338+
Ici nous avons couvert leurs propriétés:
342339

343-
- `name` -- the function name. Usually taken from the function definition, but if there's none, JavaScript tries to guess it from the context (e.g. an assignment).
344-
- `length` -- the number of arguments in the function definition. Rest parameters are not counted.
340+
- `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).
341+
- `length` - le nombre d'arguments dans la définition de la fonction. Les paramètres du reste ne sont pas comptés.
345342

346-
If the function is declared as a Function Expression (not in the main code flow), and it carries the name, then it is called a Named Function Expression. The name can be used inside to reference itself, for recursive calls or such.
343+
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.
347344

348-
Also, functions may carry additional properties. Many well-known JavaScript libraries make great use of this feature.
345+
De plus, les fonctions peuvent avoir des propriétés supplémentaires. De nombreuses bibliothèques JavaScript bien connues font bon usage de cette fonctionnalité.
349346

350-
They create a "main" function and attach many other "helper" functions to it. For instance, the [jquery](https://jquery.com) library creates a function named `$`. The [lodash](https://lodash.com) library creates a function `_`. And then adds `_.clone`, `_.keyBy` and other properties to (see the [docs](https://lodash.com/docs) when you want learn more about them). Actually, they do it to lessen their pollution of the global space, so that a single library gives only one global variable. That reduces the possibility of naming conflicts.
347+
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 [docs] (https://lodash.com/docs) lorsque vous souhaitez en savoir plus à leur sujet). En fait, ils 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.
351348

352-
So, a function can do a useful job by itself and also carry a bunch of other functionality in properties.
349+
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)