Bonsoir à tous,
Il y a de nombreux mois, j'ai voulu revoir en détails les bases du JS et, sur le channel IRC http://irc.lc/freenode/javascript , on m'a conseillé trois lectures :
-
Eloquent JavaScript, qui apparemment est une référence disponible gratuitement ici : http://eloquentjavascript.net/ (il existe une version française mais j'ai constaté quelques petites incohérences de traduction, je préfère clairement l'original en anglais et je me base sur cette version) ;
-
Programming JavaScript Applications ( http://t1.gstatic.com/images?q=tbn:ANd9GcScsPtvBAmWFjKn6nKBdtxrIAdi3IedQZfGhrJQ_hBmRc4AX4i2 ) ;
-
Enfin, http://robotlolita.me/2011/10/09/understanding-javascript-oop.html (traite de l'orienté objets).
J'ai enfin ( ) commencé la lecture de Eloquent JavaScript (L'éloquent JavaScript) et quelque chose me chiffonne un peu. J'espère que vous saurez éclairer ma lanterne.
Questions
-
L'auteur affirme qu'une "expression" produit une valeur (toute valeur est une expression, une expression peut être constituée d'une autre expression séparée par un opérateur binaire, ou encore encadrée par des parenthèses, etc.). En particulier, une fonction est une expression lorsqu'elle retourne une valeur (page 28).
-
Page 12 : une fonction est une valeur. Un objet est une valeur. Un nombre en est une également, etc.
-
L'auteur affirme, page 27, que
alert
est une variable qui possède une fonction. -
Toujours page 27, il indique qu'un appel à une fonction se fait en ajoutant des parenthèses après une expression qui produit une fonction.
-
Même page : "Un appel à une fonction qui retourne une valeur peut être utilisé au sein d’une expression, puisqu’une fonction qui retourne une valeur est une expression.".
-
Bon je saute plusieurs pages, pour aller au "Résumé" du chapitre "Fonctions" ! (page 55). Il est écrit : le mot-clé
function
, quand il est utilisé en tant qu'expression, peut créer une valeur de type fonction. Quand utilisé comme une instruction, il peut être utilisé pour déclarer une variable et lui donner une fonction comme valeur. (traduction littérale)
En complément de ça (ie. : de la puce n°6), l'auteur donne ce code :
1 2 3 4 5 | // Create a function value f var f = function(a) { console.log(a + 2); }; // Declare g to be a function function g(a, b) { return a*b*3.5; } |
Questions
-
Que l'auteur ait dit qu'une fonction est une variable, puis qu'ailleurs il ait expliqué que c'est une valeur ou encore une expression : peu importe, ça ne me choque pas. En effet, ces trois mots sont presque toujours synonymes. Bien qu'une valeur puisse ne pas être une variable, un nom de variable est toujours une valeur. Une valeur et un nom de variable sont toujours une expression, bien qu'une expression puisse ne pas être une variable. Une expression est toujours une valeur. Bref on voit bien que ces mots sont en effet presque toujours interchangeables/synonymes.
-
Par contre, là où j'ai quelques doutes, c'est déjà que l'auteur semble faire une grande différence entre initialiser une variable en lui donnant une fonction, et déclarer une fonction sans la mettre explicitement dans une variable (puce n°6). Pour moi, ces deux façons d'utiliser le mot-clé
function
sont strictement identiques : dans les deux cas une variable est utilisée.var f = function(a)...
ici la variablef
. Et dansfunction g(a, b)...
, ici c'est la variableg
(selon les propres dires de l'auteur). Donc dans l'une ou l'autre façon de faire, la fonction est bien une valeur (ici pas de contradiction avec la puce n°6 hein). La "contradiction", si c'en est une, c'est que l'auteur semble réellement différencier ces deux façons de faire, et je ne comprends pas pourquoi. -
Enfin, j'aimerais parler des puces n°4 et n°5. Si j'ai bien compris, l'auteur considère qu'ici :
g(3.2);
, il y a en tout deux expressions :g
puisque c'est une variable qui contient la fonction et3.2
. Est-ce bien cela ? Seulement, par définition d'une expression, on pourrait donc avoir :(g + 56)(3.2);
: en effet, une expression peut être l'application d'un opérateur binaire entre deux expressions ! Or ça ne fonctionne pas : on voit bien que l'auteur a manqué de rigueur en disant qu'un appel de fonction consiste en l'utilisation de parenthèses après une expression. Non ? Concernant la puce n°5, l'auteur semble dire que si la fonction retourne une valeur, alors on peut considérer non seulement que son nom est une variable/une expression, MAIS AUSSI que son APPEL en est une ! Je trouve ça cohérent, mais l'auteur ne l'a pas dit mot pour mot, j'aimerais bien avoir votre avis là-dessus : pensez-vous quefoo()
est une expression ? Si oui, de combien d'expressions est-elle constituée ? 1 :foo
? Un appel serait donc une catégorie particulière d'expressions (à cause des parenthèses). 2 :foo
et()
? -
Question plus générale : cette vision des fonctions, qui seraient des valeurs/variables voire expressions est-elle propre à l'auteur ? Ou est-ce communément admis par les informaticiens ? N'est-ce d'ailleurs pas ce que l'on appelle "fonctions valuées" ?