Kirjastot sulkeumien kautta JavaScriptissä

Usein JavaScriptissä luodaan kirjastoja, jotka edustavat funktioiden kokoelmia muiden ohjelmoijien käyttöön.

Tällaiset kirjastot yleensä kääritään moduuleihin sulkeumien kautta. Tämä tehdään siksi, että kirjaston liittämisen yhteydessä ulkoiseen maailmaan ilmestyisi mahdollisimman vähän funktioita.

Yleensä jokainen kirjasto pyrkii luomaan ulkoiseen maailmaan vain yhden muuttujan - olion, joka sisältää kirjaston funktiot. Samalla kirjaston koodin sisällä osa funktioista on pääasiallisia, ja osa - apufunktioita. On selvää, että haluamme viedä ulkoiseen maailmaan vain tarvittavat funktiot, eivätkä apufunktiot täytä vienti-oliota.

Katsotaanpa esimerkkiä. Oletetaan, että meillä on seuraava funktioiden kokoelma, jonka haluaisimme muuttaa kirjastoksi:

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(''));
}

// apufunktio
function sum(arr) {
  let res = 0;
  
  for (let elem of arr) {
    res += +elem;
  }
  
  return res;
}

Kootaan funktiomme moduuliksi:

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(''));
  }
  
  // apufunktio
  function sum(arr) {
    let res = 0;
    
    for (let elem of arr) {
      res += +elem;
    }
    
    return res;
  }
})();

Ja nyt viedään kaikki funktiot, paitsi apufunktio:

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(''));
  }
  
  // apufunktio
  function sum(arr) {
    let res = 0;
    
    for (let elem of arr) {
      res += +elem;
    }
    
    return res;
  }
  
  window.math = {square, cube, avg, digitsSum};
})();

Oletetaan, että meillä on HTML-sivu index.html:

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

Liitetään siihen kirjastomme:

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

Käytetään kirjastomme funktioita:

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

Annettu seuraava koodi:

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;
}

// apufunktio
function sum(arr, pow) {
  let res = 0;
  
  for (let elem of arr) {
    res += elem ** pow;
  }
  
  return res;
}

Järjestä tämä koodi moduuliksi. Vie ulos kaikki funktiot, paitsi apufunktio.

Задание 2

Tutki underscore-kirjastoa. Tee oma vastaava kirjastosi, toistaen siihen 5-10 alkuperäisen kirjaston funktioita.