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:

math.jsfunction 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:

math.js;(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:

math.js;(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:

index.html<html>
  <head>
    <script>
      
    </script>
  </head>
</html>

Pripnimo nanjo našo knjižnico:

index.html<html>
  <head>
    <script src="math.js"></script>
    <script>
      
    </script>
  </head>
</html>

Uporabimo funkcije iz naše knjižnice:

index.html<html>
  <head>
    <script src="math.js"></script>
    <script>
      alert(math.avg([1, 2, 3]) + math.square());
    </script>
  </head>
</html>
Задание 1

Podana je naslednja koda:

javascriptfunction 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.

Задание 2

Preučite knjižnico underscore. Ustvarite svojo podobno knjižnico, tako da ponovite v njej 5-10 funkcij originalne knjižnice.