Bibliotēkas ar aizvērumiem JavaScript

Bieži JavaScript tiek izveidotas bibliotēkas, kuras ir funkciju kopas, ko var izmantot citi programmētāji.

Šādas bibliotēkas parasti tiek ietītas moduļos ar aizvērumu palīdzību. Tas tiek darīts, lai pievienojot bibliotēku ārējā vidē parādītos pēc iespējas mazāk funkciju.

Parasti katra bibliotēka cenšas izveidot ārējā vidē tikai vienu mainīgo - objektu ar bibliotēkas funkcijām. Tajā pašā laikā bibliotēkas kodā daļa funkciju ir pamata, bet daļa - palīgfunkcijas. Acīmredzot, ārējā vidē mēs vēlamies eksportēt tikai nepieciešamās funkcijas, nepiesārņojot eksportēto objektu ar palīgfunkcijām.

Apskatīsim piemērā. Pieņemsim, ka mums ir šāda funkciju kopa, kuru mēs vēlētos pārvērst bibliotēkā:

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

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

Iesaiņosim mūsu funkcijas moduļa formātā:

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

Un tagad eksportēsim visas funkcijas, izņemot palīgfunkciju:

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

Pieņemsim, ka mums ir HTML lapa index.html:

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

Pievienosim tai mūsu bibliotēku:

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

Izmantosim funkcijas no mūsu bibliotēkas:

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

Dots šāds kods:

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

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

Noformējiet šo kodu kā moduli. Eksportējet ārā visas funkcijas, izņemot palīgfunkciju.

Задание 2

Izpētiet bibliotēku underscore. Izveidojiet savu līdzīgu bibliotēku, atkārtojot tajā 5-10 funkcijas no oriģinālās bibliotēkas.