Biblioteci prin închideri în JavaScript
Adesea în JavaScript se creează biblioteci, care reprezintă seturi de funcții pentru utilizarea de către alți programatori.
Asemenea biblioteci sunt de obicei încapsulate în module prin închideri. Acest lucru se face pentru ca, la conectarea bibliotecii în lumea exterioară, să apară cât mai puține funcții.
De regulă, fiecare bibliotecă se străduiește să creeze în lumea exterioară doar o singură variabilă - un obiect cu funcțiile bibliotecii. În același timp, în interiorul codului bibliotecii, o parte din funcții sunt principale, iar o parte - auxiliare. Evident, că în lumea exterioară vrem să exportăm doar funcțiile necesare, fără a încărca obiectul exportat cu funcții auxiliare.
Să vedem un exemplu. Să presupunem că avem următorul set de funcții pe care am dori să le transformăm într-o bibliotecă:
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(''));
}
// funcție auxiliară
function sum(arr) {
let res = 0;
for (let elem of arr) {
res += +elem;
}
return res;
}
Să încadrăm funcțiile noastre sub forma unui modul:
;(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(''));
}
// funcție auxiliară
function sum(arr) {
let res = 0;
for (let elem of arr) {
res += +elem;
}
return res;
}
})();
Și acum să exportăm toate funcțiile, cu excepția celei auxiliare:
;(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(''));
}
// funcție auxiliară
function sum(arr) {
let res = 0;
for (let elem of arr) {
res += +elem;
}
return res;
}
window.math = {square, cube, avg, digitsSum};
})();
Să presupunem că avem pagina HTML index.html:
<html>
<head>
<script>
</script>
</head>
</html>
Să conectăm la ea biblioteca noastră:
<html>
<head>
<script src="math.js"></script>
<script>
</script>
</head>
</html>
Să utilizăm funcțiile din biblioteca noastră:
<html>
<head>
<script src="math.js"></script>
<script>
alert(math.avg([1, 2, 3]) + math.square());
</script>
</head>
</html>
Este dat următorul cod:
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;
}
// funcție auxiliară
function sum(arr, pow) {
let res = 0;
for (let elem of arr) {
res += elem ** pow;
}
return res;
}
Formatați acest cod sub forma unui modul. Exportați toate funcțiile, cu excepția celei auxiliare.
Studiați biblioteca underscore.
Creați o bibliotecă similară proprie, repetând
în ea 5-10 funcții din biblioteca
originală.