Бібліятэкі праз замыканні ў 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 функцый арыгінальнай
бібліятэкі.