Knjižnice s pomočjo zaprtij v JavaScript
Pogosto so v JavaScript ustvarjene knjižnice, ki predstavljajo nize funkcij za uporabo s strani drugih programerjev.
Takšne knjižnice so običajno zavite v module s pomočjo zaprtij. To se naredi zato, da se ob priklopu knjižnice v zunanjem svetu pojavi čim manj funkcij.
Pravilo je, da vsaka knjižnica skuša ustvariti v zunanjem svetu samo eno spremenljivko - objekt s funkcijami knjižnice. Pri tem so znotraj kode knjižnice nekatere funkcije osnovne, nekatere pa so pomožne. Očitno želimo v zunanji svet izvoziti samo potrebne funkcije, ne da bi zasmradili izvožen objekt s pomožnimi funkcijami.
Poglejmo si na primeru. Recimo, da imamo naslednji niz funkcij, ki jih želimo spremeniti v knjižnico:
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(''));
}
// pomožna funkcija
function sum(arr) {
let res = 0;
for (let elem of arr) {
res += +elem;
}
return res;
}
Oblikujmo naše funkcije v 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(''));
}
// pomožna funkcija
function sum(arr) {
let res = 0;
for (let elem of arr) {
res += +elem;
}
return res;
}
})();
In sedaj izvozimo vse funkcije, razen pomožne:
;(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(''));
}
// pomožna funkcija
function sum(arr) {
let res = 0;
for (let elem of arr) {
res += +elem;
}
return res;
}
window.math = {square, cube, avg, digitsSum};
})();
Recimo, da imamo HTML stran index.html:
<html>
<head>
<script>
</script>
</head>
</html>
Pripnimo nanjo našo knjižnico:
<html>
<head>
<script src="math.js"></script>
<script>
</script>
</head>
</html>
Uporabimo funkcije iz naše knjižnice:
<html>
<head>
<script src="math.js"></script>
<script>
alert(math.avg([1, 2, 3]) + math.square());
</script>
</head>
</html>
Podana je naslednja koda:
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;
}
// pomožna funkcija
function sum(arr, pow) {
let res = 0;
for (let elem of arr) {
res += elem ** pow;
}
return res;
}
Oblikujte to kodo v modul. Izvozite ven vse funkcije, razen pomožne.
Preučite knjižnico underscore.
Ustvarite svojo podobno knjižnico, tako da ponovite
v njej 5-10 funkcij originalne
knjižnice.