Les fonctions et la portée

4 min de lecture

Il est maintenant temps de s'attaquer à du sérieux, j'ai nommé : les fonctions et la portée en JavaScript.

Les fonctions

Les fonctions sont des blocs de code réutilisables qui effectuent une tâche spécifique. Elles permettent d'organiser le code, de le rendre plus lisible et de réduire la duplication. Elles peuvent prendre des paramètres en entrée et retourner une valeur en sortie.

On l'avait déjà vu dans l'article sur la syntaxe, mais il est important de le rappeler :

  • Fonction déclarée : Utilise le mot-clé function suivi du nom de la fonction.
  • Fonction anonyme : N'a pas de nom et est généralement utilisée comme argument pour une autre fonction.
  • Fonction fléchée : Une syntaxe plus concise pour déclarer des fonctions.
function addition(a, b) {
  return a + b;
}

Si tu relis les premiers mots de cette section (sur les fonctions), tu remarqueras que j'ai dit que les fonctions sont des blocs de code réutilisables qui effectuent une tâche spécifique.

C'est un peu vague, non ? Disons qu'on comprend l'idée générale, mais qu'est-ce que ça veut dire au juste ?

Utilisation des fonctions

Prenons un exemple simple, avec une fonction qui vérifie si un nombre est pair ou impair.

function isEven(number) {
	return number % 2 === 0;
}

Dans cet exemple, nous avons une fonction isEven qui prend un nombre en paramètre et retourne true si le nombre est pair, sinon elle retourne false.

On peut ensuite appeler cette fonction avec différents nombres pour vérifier s'ils sont pairs ou impairs.

console.log(isEven(4)); // true
console.log(isEven(5)); // false

Dans cet exemple, nous avons appelé la fonction isEven avec les nombres 4 et 5 en tant qu'arguments.

Paramètres et arguments

Les paramètres sont les variables déclarées dans la définition de la fonction.
Les arguments sont les valeurs passées à la fonction lors de son appel.

La portée

La portée (ou scope en anglais) fait référence à la visibilité des variables et des fonctions dans le code.

Elle détermine où une variable ou une fonction peut être utilisée dans le code.
Il existe trois types de portée en JavaScript :

  • Portée globale (global scope) : La variable est accessible partout dans le code.
  • Portée de bloc (block scope) : La variable est accessible uniquement à l'intérieur du bloc où elle a été déclarée.
  • Portée de fonction (function scope) : La variable est accessible uniquement à l'intérieur de la fonction où elle a été déclarée.

Portée de bloc

La portée de bloc est introduite avec les mots-clés let et const.
Les variables déclarées avec var ont une portée fonctionnelle ou globale.

Portée globale (global scope)

La portée globale est la portée la plus large.
Les variables déclarées en dehors de toute fonction ou bloc de code ont une portée globale.

Une portée globale signifie que la variable est accessible partout dans le code.

Déclaration de variable globale

Attention à ne pas déclarer de variables globales, sauf si c'est intentionnel et nécessaire !

Les variables globales peuvent entraîner des conflits de variables/fonctions (remplacement) des variables existantes, notamment des variables de l'objet window dans le navigateur.

Portée de bloc (block scope)

La portée de bloc est une portée qui est limitée au bloc de code dans lequel la variable a été déclarée.

Seules les variables déclarées avec let et const peuvent avoir une portée de bloc.

Limité au bloc de code ?

Par "bloc de code", on parle de tout ce qui est entre accolades {} !
Ça peut être une fonction, une boucle, une condition, etc.

let x = 10;

if (true) {
	let x = 20;
	console.log(x); // 20
}

console.log(x); // 10

Dans cet exemple, nous avons :

  • Une déclaration d'une variable x en dehors d'un bloc de code
  • Une déclaration d'une variable x à l'intérieur d'un bloc de code (condition)

Maintenant, regardons ce qui se passe selon le mot-clé utilisé pour déclarer la variable x :

  • La variable x est déclarée avec let dans le scope global.
  • Dans le bloc if, une nouvelle variable x est déclarée, masquant la variable globale.
  • Lorsque nous affichons x à l'intérieur du bloc, il renvoie la valeur de la variable locale (20).
  • Lorsque nous affichons x en dehors du bloc, il renvoie la valeur de la variable globale (10).

On remarque que si on utilise let ou const, la variable x déclarée à l'intérieur du bloc de code n'est pas "la même" que celle déclarée à l'extérieur.
Elle est locale au bloc de code, et donc inaccessible en dehors de celui-ci.

En revanche, si on utilise var, la variable x déclarée à l'intérieur du bloc de code est globale et écrase la variable x déclarée à l'extérieur.

Utilisation de var

Rien que pour ça, il est préférable d'éviter d'utiliser var et de lui préférer let ou const.

Portée de fonction (function scope)

Pour la portée de fonction, on parle de la portée des variables déclarées à l'intérieur d'une fonction.

Les trois mots-clés var, let et const peuvent être utilisés pour déclarer des variables avec une portée de fonction.

let x = 10;
		
function example() {
	let x = 20;
	let y = "Bonjour !";

	if (true) {
		let x = 30;
		console.log(x); // 30
	}

	console.log(x); // 20
}

example();
console.log(x); // 10
console.log(y); // ReferenceError: y is not defined

Le fonctionnement est le même que pour la portée de bloc, avec cette fois-ci une portée limitée à la fonction (y compris pour les variables déclarées avec var).

Particularités de var

On a vu que var n'a pas la possibilité de déclarer des variables avec une portée de bloc, contrairement à let et const.

Mais il y a une autre particularité à prendre en compte :

  • Les variables déclarées avec var sont hoistées.
    Ça signifie que la déclaration de la variable est déplacée en haut de la portée dans laquelle elle a été déclarée.
  • Les variables déclarées avec let et const ne sont pas hoistées.

Hoisting

Le hoisting peut entraîner des comportements inattendus si on essaie d'accéder à une variable avant sa déclaration.

Il est donc préférable de toujours déclarer les variables au début de leur portée.

Petit exemple pour illustrer ça :

console.log(x); // ReferenceError: Cannot access 'x' before initialization

let x = 10;
console.log(x); // 10

Dans cet exemple, on voit que la variable x est déclarée après son utilisation.
Cependant, grâce (ou à cause, je te laisse choisir !) au hoisting, la déclaration de la variable x est déplacée en haut de la portée, ce qui permet d'accéder à sa valeur avant sa déclaration.

On peut donc dire que la variable x est undefined avant sa déclaration, mais elle existe déjà. On peut donc l'utiliser avant sa déclaration (enfin, on aura undefined comme valeur).

C'est un peu déroutant, non ?

Utilisation de var

Promis, c'est la dernière fois que je te dis de ne pas utiliser var !

Mais tu l'auras compris, var est vraiment très spécial et peut très vite devenir une source de bugs.

Conclusion

Voilà, c'est "tout" pour cet article sur les fonctions et la portée en JavaScript !
Comme les articles précédents, ça fait beaucoup d'informations.

Encore une fois, prends le temps d'expérimenter et de jouer avec les notions abordées dans cet article avant de passer à la suite !

Dernières documentations

Introduction à JavaScript

Dernière modification :

Parlons un peu de JavaScript, le langage de programmation incontournable pour le développement web.

La syntaxe de base de JavaScript

Dernière modification :

Découvrons ensemble la syntaxe de base de JavaScript et comment il fonctionne dans le navigateur.

Memento DevMemento Dev

Plateforme de ressources et documentations synthétiques et concises, conçue pour les développeurs ou passionnés de l‘informatique en quête de savoir.


© 2022 - 2025 Memento Dev. Tous droits réservés

Memento Dev est une plateforme open-source, développée par Gauthier Daniels, soutenue et maintenue par une communauté de contributeurs passionnés.