Библиотеке кроз затварања у JavaScript-у
Често се у JavaScript-у креирају библиотеке, које представљају скупове функција за употребу од стране других програмера.
Такве библиотеке се обично упакују у модуле кроз затварања. То се ради како би при повезивању библиотеке у спољном свету појавило што мање функција.
У принципу, свака библиотека се труди да створи у спољном свету само једну променљиву - објекат са функцијама библиотеке. Притом унутар кода библиотеке, неке функције су основне, а неке - помоћне. Очигледно је да у спољни свет желимо да извеземо само потребне функције, не затрпавајући извезени објекат помоћним функцијама.
Погледајмо на примеру. Претпоставимо да имамо следећи скуп функција које бисмо желели да претворимо у библиотеку:
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(''));
}
// помоћна функција
function sum(arr) {
let res = 0;
for (let elem of arr) {
res += +elem;
}
return res;
}
Упакујмо наше функције у облик модула:
;(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(''));
}
// помоћна функција
function sum(arr) {
let res = 0;
for (let elem of arr) {
res += +elem;
}
return res;
}
})();
А сада извезимо све функције, осим помоћне:
;(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(''));
}
// помоћна функција
function sum(arr) {
let res = 0;
for (let elem of arr) {
res += +elem;
}
return res;
}
window.math = {square, cube, avg, digitsSum};
})();
Претпоставимо да имамо HTML страницу index.html:
<html>
<head>
<script>
</script>
</head>
</html>
Прикључимо нашу библиотеку на њу:
<html>
<head>
<script src="math.js"></script>
<script>
</script>
</head>
</html>
Искористимо функције из наше библиотеке:
<html>
<head>
<script src="math.js"></script>
<script>
alert(math.avg([1, 2, 3]) + math.square());
</script>
</head>
</html>
Дат је следећи код:
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;
}
// помоћна функција
function sum(arr, pow) {
let res = 0;
for (let elem of arr) {
res += elem ** pow;
}
return res;
}
Оформите овај код у облик модула. Извезете напоље све функције, осим помоћне.
Проучите библиотеку underscore.
Направите вашу сличну библиотеку, поновивши
у њој 5-10 функција оригиналне
библиотеке.