Библиотеке кроз затварања у JavaScript-у

Често се у JavaScript-у креирају библиотеке, које представљају скупове функција за употребу од стране других програмера.

Такве библиотеке се обично упакују у модуле кроз затварања. То се ради како би при повезивању библиотеке у спољном свету појавило што мање функција.

У принципу, свака библиотека се труди да створи у спољном свету само једну променљиву - објекат са функцијама библиотеке. Притом унутар кода библиотеке, неке функције су основне, а неке - помоћне. Очигледно је да у спољни свет желимо да извеземо само потребне функције, не затрпавајући извезени објекат помоћним функцијама.

Погледајмо на примеру. Претпоставимо да имамо следећи скуп функција које бисмо желели да претворимо у библиотеку:

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

// помоћна функција
function sum(arr) {
  let res = 0;
  
  for (let elem of arr) {
    res += +elem;
  }
  
  return res;
}

Упакујмо наше функције у облик модула:

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(''));
  }
  
  // помоћна функција
  function sum(arr) {
    let res = 0;
    
    for (let elem of arr) {
      res += +elem;
    }
    
    return res;
  }
})();

А сада извезимо све функције, осим помоћне:

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(''));
  }
  
  // помоћна функција
  function sum(arr) {
    let res = 0;
    
    for (let elem of arr) {
      res += +elem;
    }
    
    return res;
  }
  
  window.math = {square, cube, avg, digitsSum};
})();

Претпоставимо да имамо HTML страницу index.html:

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

Прикључимо нашу библиотеку на њу:

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

Искористимо функције из наше библиотеке:

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

Дат је следећи код:

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

// помоћна функција
function sum(arr, pow) {
  let res = 0;
  
  for (let elem of arr) {
    res += elem ** pow;
  }
  
  return res;
}

Оформите овај код у облик модула. Извезете напоље све функције, осим помоћне.

Задание 2

Проучите библиотеку underscore. Направите вашу сличну библиотеку, поновивши у њој 5-10 функција оригиналне библиотеке.