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:

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

// 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:

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

Og nå eksporterer vi alle funksjoner, unntatt hjelpefunksjonen:

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

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

La oss koble biblioteket vårt til den:

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

La oss bruke funksjoner fra biblioteket vårt:

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

Følgende kode er gitt:

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

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

Задание 2

Studer biblioteket underscore. Lag ditt eget tilsvarende bibliotek, og gjenta 5-10 funksjoner fra det originale biblioteket.