Biblioteke putem zatvaranja u JavaScript-u
Često se u JavaScript-u kreiraju biblioteke, koje predstavljaju skupove funkcija za korišćenje od strane drugih programera.
Takve biblioteke se obično umataju u module putem zatvaranja. Ovo se radi kako bi se, pri povezivanju biblioteke, u spoljnom svetu poyavljivalo što manje funkcija.
U pravilu svaka biblioteka nastoji da kreira u spoljnom svetu samo jednu promenljivu - objekat sa funkcijama biblioteke. Pritom unutar koda biblioteke deo funkcija su osnovne, a deo - pomoćne. Očigledno je, da u spoljni svet želimo da izvezemo samo potrebne funkcije, ne zatrpavajući izvezeni objekat pomoćnim funkcijama.
Hajde da pogledamo na primeru. Neka imamo sledeći skup funkcija koje bismo želeli da pretvorimo u biblioteku:
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;
}
Hajde da našu biblioteku formiramo u vidu modula:
;(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;
}
})();
A sada da izvezemo sve funkcije, osim 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};
})();
Neka imamo HTML stranicu index.html:
<html>
<head>
<script>
</script>
</head>
</html>
Povežimo je sa našom bibliotekom:
<html>
<head>
<script src="math.js"></script>
<script>
</script>
</head>
</html>
Iskoristimo funkcije iz naše biblioteke:
<html>
<head>
<script src="math.js"></script>
<script>
alert(math.avg([1, 2, 3]) + math.square());
</script>
</head>
</html>
Dat je sledeći kod:
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;
}
Oformite ovaj kod u vidu modula. Izvezite spolja sve funkcije, osim pomoćne.
Proučite biblioteku underscore.
Napravite sopstvenu sličnu biblioteku, ponovivši
u njoj 5-10 funkcija originalne
biblioteke.