Concept
Le concept de fonction viens de la notation mathématique “f(x)” : pour représenter le resultat d’une modification d’une valeur abstraite “x” par une sérié d’opération (mutiliplication , addition ect … ) . Mais on peut aussi penser aux fonctions comme à des “verbes” dans un language. Certain verbes n’ont pas d’objets comme “dormir” et certain supposent un objet comme “manger qq”.
On peut aussi voir les fonction comme des “tuyaux” dans lesquelles passent les valeurs du programme afin d’être transformées. Elles ont comme input les “arguments” et comme output une valeur de retour “return”.
L’utilisation des fonctions n’est pas obligatoires pour qu’un programme fonctionne mais elles améliorent grandement son organisation et sa lisibilité.
Déclaration
La définition d’un verbe dans un dictionnaire est très proche d’un code de déclaration de fonction.
Déclarer une fonction signifie décrire son comportement. C’est son “plan d’action” sous forme de code . Le code contenu entre les balises {} sera exécuté au moment de son “appel”.
function sayhello() {
MessageLog.trace("hello")
}
Appel
Pour appeller une fonction et executer son code il suffit d’écrire son nom suivi de parenthèses ()
function sayhello() {
MessageLog.trace("hello")
}
sayhello()
sayhello()
sayhello()
// affiche
// hello
// hello
// hello
Fonctions avec argument
Les fonctions avec argument ont pour but de “faire quelque chose” avec une variable. Au moment de la déclaration on ne connais pas la valeur de la variable qui va être transmise alors on utilise une abstraction. Quelque chose qui peut varier mais dont le contenu est globalement prévisible comme “aliment” ou “fruit” si on veut parler d’une fonction “manger” par exemple.
Comme dans une définition de dictionnaire où l’on précise qu’un verbe attends une certains catégorie de mots après lui : parler_à(quelqu’un)
Plus simplement : lorsque l’on défini un argument on défini les “input” de la fonction un peu comme les inports d’un groupe dans la nodeview
function say(_word) {
MessageLog.trace(_word)
}
say("bonjour")
// affiche :
// bonjour
function manger(_aliment) {
MessageLog.trace(" je mange "+_aliment)
}
manger("une pomme")
// affiche :
// je mange une pomme
function stand_up_introduction(_word,_city) {
MessageLog.trace("HEY ")
MessageLog.trace(_word)
MessageLog.trace(_city)
MessageLog.trace("!")
}
stand_up_introduction("bonjour","toulouse")
// affiche :
// HEY
// bonjour
// toulouse
// !
Fonctions avec valeur de retour
Les fonctions avec valeur de retour vont pouvoir donner une valeur lorsqu’elle sont appelées : Dans cet example la fonction se comporte comme une valeur qu’on transmet à la variable “test”
function myfunc() {
return "ma_valeur_de_retour"
}
var test = myfunc()
MessageLog.trace(test)
// affiche ma_valeur_de_retour
dans la déclaration on décide de la valeur que transmettra la fonction avec le mots clef “return” . C’est l’output de la fonction. Comme dans un groupe dans la nodeview c’est son port out, à la différence qu’une fonction ne peut avoir qu’un seul output.
On peut biensur “retourner” une variable déclarée dans la fonction
function myfunc() {
var msg= "bonjour"
return msg
}
var test = myfunc()
MessageLog.trace(test)
// affiche bonjour
Avec les concepts d’argument et de return on peut maintenant écrire des petites fonctions mathématiques simples :
function additionner(_A,_B) {
var somme = _A + _B
return somme
}
var resultat = additionner(2,2)
MessageLog.trace(resultat)
// affiche 4
Fonctions Imbriquées
On peut tout à fait appeler une fonction dans une déclaration de fonction
function ajouter_flammes(_mots){
return "🔥"+_mots+"🔥"
}
function dire_un_bonjour_en_feu_a(_prenom){
var phrase = " bonjour "+_prenom+" ! "
phrase = ajouter_flammes(_phrase)
return phrase
}
var test= dire_un_bonjour_en_feu_a("le chat")
MessageLog.trace(resultat)
// affiche 🔥 bonjour le chat ! 🔥
on peut également déclarer et appeler une fonction dans une fonction. Lorsque l’on veut décomposer le code d’une fonction complexe par exemple.
On peut écrire le code ci dessus comme ce ci :
// fonction principale
function dire_un_bonjour_en_feu_a(_prenom){
// sous fonction
function ajouter_flammes(_mots){
return "🔥"+_mots+"🔥"
}
var phrase = " bonjour "+_prenom+" ! "
phrase = ajouter_flammes(_phrase)
return phrase
}
var test= dire_un_bonjour_en_feu_a("le chat")
MessageLog.trace(resultat)
// affiche 🔥 bonjour le chat ! 🔥
Le resultat est le meme. En revanche les autres fonctions n’auront plus acccès à “ajouter flammes” car elle est déclaré à l’interieur de “dir_un_bonjour_en_feu_a”
Ce code ne fonctionnera pas :
// fonction principale
function dire_un_bonjour_en_feu_a(_prenom){
// sous fonction
function ajouter_flammes(_mots){
return "🔥"+_mots+"🔥"
}
var phrase = " bonjour "+_prenom+" ! "
phrase = ajouter_flammes(_phrase)
return phrase
}
// fonction principale
function dire_un_aurevoir_en_feu_a(_prenom){
var phrase = " aurevoir"+_prenom+" ! "
// CETTE FONCTION N'EST PAS VISIBLE D'ICI !
phrase = ajouter_flammes(_phrase)
return phrase
}
var test= dire_un_aurevoir_en_feu_a("le chat")
MessageLog.trace(resultat)
// affiche une erreur
Pour que “aurevoir” et “bonjour” fonctionnent il faudra replacer “ajouter_flammes” à l’exterieur
function ajouter_flammes(_mots){
return "🔥"+_mots+"🔥"
}
function dire_un_bonjour_en_feu_a(_prenom){
var phrase = " bonjour "+_prenom+" ! "
phrase = ajouter_flammes(_phrase)
return phrase
}
function dire_un_aurevoir_en_feu_a(_prenom){
var phrase = " aurevoir"+_prenom+" ! "
phrase = ajouter_flammes(_phrase)
return phrase
}
var test= dire_un_aurevoir_en_feu_a("le chat")
MessageLog.trace(resultat)
// affiche 🔥 aurevoir le chat ! 🔥
On pourrait encore décomposer nos fonction ainsi :
function ajouter_char_des_deux_cotes(_mots,_char){
return _char+_mots+_char
}
function ajouter_flammes(_mots){
return ajouter_char_des_deux_cotes(_mots,"🔥")
}
function dire_un_bonjour_en_feu_a(_prenom){
var phrase = " bonjour "+_prenom+" ! "
phrase = ajouter_flammes(_phrase)
return phrase
}
function dire_un_aurevoir_en_feu_a(_prenom){
var phrase = " aurevoir"+_prenom+" ! "
phrase = ajouter_flammes(_phrase)
return phrase
}
var test= dire_un_aurevoir_en_feu_a("le chat")
MessageLog.trace(resultat)
// affiche 🔥 aurevoir le chat ! 🔥