Функції є одним із найпотужніших і найважливіших понять у програмуванні.
Функції на кшталт математичних виконують перетворення, вони приймають вхідні значення, які називаються аргументами і повертає вихідне значення.
Оголошення функцій
Функції подібно до змінних повинні бути оголошені. Давайте зробимо це з функцією double, яка набуває аргументу з ім'ям х і повертає подвоєний х:
<code data-language="javascript">function double( x) {return 2*x; }
До функції вище можна звертатися до її оголошення.
У JavaScript функції це також і змінні; вони можуть зберігатися в змінних (подібно до числах, рядків та ін.) і передаватися в інші функції як аргументи:
<code data-language="javascript">var double=function(x) { return 2 * x; };
До функції вище не можна звертатися до її оголошення, як і до будь-якої іншої змінної.
Функції вищого порядку
Функції вищого ладу є функціями, які керують іншими функціями. Наприклад, функція може приймати інші функції як аргументи і/або задавати функцію як значення, що повертається. Подібні незвичайні функціональні методи є потужними конструкціями, доступними вам у JavaScript та інших мовах високого рівня, таких як Python, Lisp та ін. Тепер ми створимо дві прості функції add_2 та double, а також функцію вищого порядку з ім'ям map. Функція map прийматиме два аргументи: func і list (тому функція оголошується як map(func,list)) та повертати масив. func (перший аргумент) буде функцією, яка застосовується до кожного елемента в масиві list (другий аргумент).
<code data-language="javascript">//Визначаємо дві прості функції var add_2=function(x) { return x + 2; }; var double=function(x) { return 2 * x; }; //map це класна функція, яка набуває двох аргументів: //func функція для виклику //list масив значень для виклику з func var map=function(func, list) { var output=[]; //Вихідний список for(idx in list) { output.push( func(list[idx])); } return output; } //Ми використовуємо map, щоб застосувати функцію до всього списку //входить до map, а потім отримати відповідний вихідний список map(add_2, [5,6,7]) //=> [7, 8, 9] map(double, [5,6,7]) //=> [10, 12, 14]
Функції у наведеному вище прикладі прості. Однак, коли вони передаються як аргументи в інші функції, вони можуть брати участь у створенні більш складних функцій.
Приміром, якщо ми помічаємо, що використовуємо звернення до map (add_2, ...) і map(double, ...) у нашому коді занадто часто, то можемо вирішити створити дві спеціалізовані функції для обробки списків, які виконують бажані операції. Використовувати складові функції можна так:
<code data-language="javascript">process_add_2=function(list) { return map(add_2, list); } process_double=function(list) { return map(double, list); } process_add_2([5,6,7]) //=> [7, 8, 9] process_double([5,6,7]) //=> [10, 12, 14]
Тепер створимо функцію з ім'ям buildProcessor, яка бере функцію func як вхідні дані та повертає process_func — функцію, яка застосовує func до кожного елемента списку.
<code data-language="javascript">//функція генерує обробку списку var buildProcessor=function(func) { var process_func=function(list) { return map(func, list); } return process_func; } //buildProcessor повертає функцію, яка викликалася разом зі списком //Через buildProcessor ми можемо генерувати обробники списку add_2 та double наступним чином: process_add_2=buildProcessor(add_2); process_double=buildProcessor(double); process_add_2([5,6,7]) //=> [7, 8, 9] process_double([5,6,7]) //=> [10, 12, 14]
Давайте поглянемо на інший приклад. Ми створимо функцію з ім'ям buildMultiplier яка бере число х як вхідний параметр і повертає функцію, яка множить свій аргумент на х:
<code data-language="javascript">var buildMultiplier=function(x) { return function(y) { return x * y; } } var double=buildMultiplier(2); var triple=buildMultiplier(3); double(3); //=> 6 triple(3); //=> 9