Bibliothèques via les fermetures en JavaScript
Souvent en JavaScript, des bibliothèques sont créées, représentant des ensembles de fonctions destinés à être utilisés par d'autres programmeurs.
De telles bibliothèques sont généralement encapsulées dans des modules via des fermetures. Ceci est fait afin que, lors de la connexion de la bibliothèque, aussi peu de fonctions que possible n'apparaissent dans le monde extérieur.
En règle générale, chaque bibliothèque s'efforce de créer dans le monde extérieur une seule variable - un objet avec les fonctions de la bibliothèque. En même temps, à l'intérieur du code de la bibliothèque, certaines fonctions sont principales, et d'autres - auxiliaires. Évidemment, nous voulons exporter vers le monde extérieur uniquement les fonctions nécessaires, sans encombrer l'objet exporté avec des fonctions auxiliaires.
Regardons un exemple. Supposons que nous ayons l'ensemble de fonctions suivant que nous souhaiterions transformer en bibliothèque :
function square(num) {
return num ** 2;
}
function cube(num) {
return num ** 3;
}
function avg(arr) {
return sum(arr, 1) / arr.length;
}
function digitsSum(num) {
return sum(String(num).split(''));
}
// fonction auxiliaire
function sum(arr) {
let res = 0;
for (let elem of arr) {
res += +elem;
}
return res;
}
Encapsulons nos fonctions dans un module :
;(function() {
function square(num) {
return num ** 2;
}
function cube(num) {
return num ** 3;
}
function avg(arr) {
return sum(arr, 1) / arr.length;
}
function digitsSum(num) {
return sum(String(num).split(''));
}
// fonction auxiliaire
function sum(arr) {
let res = 0;
for (let elem of arr) {
res += +elem;
}
return res;
}
})();
Et maintenant, exportons toutes les fonctions, à l'exception de la fonction auxiliaire :
;(function() {
function square(num) {
return num ** 2;
}
function cube(num) {
return num ** 3;
}
function avg(arr) {
return sum(arr, 1) / arr.length;
}
function digitsSum(num) {
return sum(String(num).split(''));
}
// fonction auxiliaire
function sum(arr) {
let res = 0;
for (let elem of arr) {
res += +elem;
}
return res;
}
window.math = {square, cube, avg, digitsSum};
})();
Supposons que nous ayons une page HTML index.html :
<html>
<head>
<script>
</script>
</head>
</html>
Connectons-y notre bibliothèque :
<html>
<head>
<script src="math.js"></script>
<script>
</script>
</head>
</html>
Utilisons les fonctions de notre bibliothèque :
<html>
<head>
<script src="math.js"></script>
<script>
alert(math.avg([1, 2, 3]) + math.square());
</script>
</head>
</html>
Le code suivant est donné :
function avg1(arr) {
return sum(arr, 1) / arr.length;
}
function avg2(arr) {
return sum(arr, 2) / arr.length;
}
function avg3(arr) {
return sum(arr, 3) / arr.length;
}
// fonction auxiliaire
function sum(arr, pow) {
let res = 0;
for (let elem of arr) {
res += elem ** pow;
}
return res;
}
Structurez ce code sous forme de module. Exportez toutes les fonctions vers l'extérieur, à l'exception de la fonction auxiliaire.
Étudiez la bibliothèque underscore.
Créez votre propre bibliothèque similaire, en reproduisant
5-10 fonctions de la bibliothèque
originale.