Biblioteker via lukking i JavaScript
Ofte i JavaScript opprettes biblioteker, som representerer sett med funksjoner for bruk av andre programmerere.
Slike biblioteker blir vanligvis innkapslet i moduler via lukking. Dette gjøres for at ved tilkobling av biblioteket til den ytre verden skal det oppstå så få funksjoner som mulig.
Som regel prøver hvert bibliotek å opprette bare én variabel i den ytre verden - et objekt med bibliotekets funksjoner. Samtidig er en del av funksjonene grunnleggende, og en del - hjelpefunksjoner. Det er åpenbart at vi bare vil eksportere nødvendige funksjoner til den ytre verden, uten å fylle eksportobjektet med hjelpefunksjoner.
La oss se på et eksempel. La oss si at vi har følgende sett med funksjoner som vi ønsker å gjøre om til et bibliotek:
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(''));
}
// hjelpefunksjon
function sum(arr) {
let res = 0;
for (let elem of arr) {
res += +elem;
}
return res;
}
La oss pakke funksjonene våre inn i en 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(''));
}
// hjelpefunksjon
function sum(arr) {
let res = 0;
for (let elem of arr) {
res += +elem;
}
return res;
}
})();
Og nå eksporterer vi alle funksjoner, unntatt hjelpefunksjonen:
;(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(''));
}
// hjelpefunksjon
function sum(arr) {
let res = 0;
for (let elem of arr) {
res += +elem;
}
return res;
}
window.math = {square, cube, avg, digitsSum};
})();
La oss si at vi har en HTML-side index.html:
<html>
<head>
<script>
</script>
</head>
</html>
La oss koble biblioteket vårt til den:
<html>
<head>
<script src="math.js"></script>
<script>
</script>
</head>
</html>
La oss bruke funksjoner fra biblioteket vårt:
<html>
<head>
<script src="math.js"></script>
<script>
alert(math.avg([1, 2, 3]) + math.square());
</script>
</head>
</html>
Følgende kode er gitt:
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;
}
// hjelpefunksjon
function sum(arr, pow) {
let res = 0;
for (let elem of arr) {
res += elem ** pow;
}
return res;
}
Pakke denne koden inn i en modul. Eksporter alle funksjoner ut, unntatt hjelpefunksjonen.
Studer biblioteket underscore.
Lag ditt eget tilsvarende bibliotek, og gjenta
5-10 funksjoner fra det originale
biblioteket.