У загальному випадку, функція - це "підпрограма", яку можна викликати з зовнішнього (або внутрішнього, в разі рекурсії) по відношенню до функції коду. Як і сама програма, функція складається з послідовності інструкцій, званої тілом функції. Значення можуть бути передані в функцію, а функція поверне значення.
Функції - це не процедури. Функція завжди повертає значення, а процедура може повертати, а дозволяють залишати.
Щоб повернути значення, відмінне від значення за замовчуванням, в функції повинна бути інструкція return. яка вказує, що саме потрібно повернути. Функція без нього поверне значення за замовчуванням. У разі конструктора. викликаного з ключовим словом new. значення за замовчуванням - це значення його параметра this. Для інших функцій значенням за замовчуванням буде undefined.
Параметри виклику функції називаються аргументами функції. Аргументи передаються в функцію за значенням. Якщо функція змінює значення аргументу, ця зміна не відбивається на глобальному стані або викликає функції. Однак посилання на об'єкти - це теж значення, і вони відрізняються тим, що якщо функція змінює властивості об'єкта за посиланням, це зміна видно зовні функції, як показано в прикладі нижче.
Ключове слово this не посилається на функцію, яка виконується в даний момент, тому ви повинні звертатися до об'єктами Function по імені, навіть всередині тіла самої функції.
визначення функцій
Є кілька способів визначити функцію:
name Ім'я функції. param Ім'я аргументу, переданого в функцію. У функції може бути не більше 255 аргументів. statements Інструкції, з яких складається тіло функції.
Функція-вираз (оператор function)
Функція-вираз схожа на визначення функції і має такий же синтаксис (більш докладно: function operator):
name Ім'я функції. Може бути не вказано, в такому випадку функція стає анонімною. param Ім'я аргументу, переданого в функцію. У функції може бути не більше 255 аргументів. statements Інструкції, з яких складається тіло функції.
) "> Стрілочна функція-вираз (=>)
Замітка: стрілочні функції є експериментальною технологією, частиною специфікації ECMAScript 6 і поки що не підтримуються всіма браузерами.
param Ім'я параметра. Якщо параметрів немає, замість них потрібно поставити (). Якщо параметрів більше одного, їх також потрібно укласти в (). statements or expression Якщо інструкцій кілька, їх потрібно укласти в <>. Для одного виразу фігурних дужок не потрібно, а результат цього виразу буде повернений функцією (тобто функція x => 3 + 8 поверне 11).
конструктор Function
Об'єкти Function можна створювати за допомогою оператора new (як і будь-які інші об'єкти):
Конструктор Function можна викликати і без оператора new, ефект буде тим же.
параметри функції
Примітка: Решта параметри і параметри за замовчуванням - це експериментальна технологія, частина специфікації ECMAScript 6, і вони поки ще не отримали широкої підтримки серед браузерів.
Параметри за замовчуванням
Решта параметри
Синтаксис залишилися параметрів дозволяє передати нескінченне число аргументів як масив. Подробиці можна знайти в статті Решта параметри.
об'єкт arguments
Усередині функції отримати доступ до її аргументів можна через об'єкт arguments.
- arguments. Об'єкт, схожий на масив і містить всі аргументи, передані в поточну функцію.
- arguments.callee. Функція, що виконується в поточний момент.
- arguments.caller. Функція, яка викликала поточну функцію.
- arguments.length. Число аргументів, переданих у функцію.
визначення методів
Геттери і сеттери
Можна визначати геттери (методи для читання) і сеттери (методи для зміни) для будь-якого вбудованого або призначеного для користувача об'єкта, який підтримує додавання нових властивостей. Для цього використовується синтаксис литерала об'єкта.
get Пов'язує властивість об'єкта з функцією, яка буде викликана при зверненні до властивості. set Пов'язує властивість об'єкта з функцією, яка буде викликана при спробі зміни властивості.
Синтаксис визначення методів
Примітка: Визначення методів - це експериментальна технологія, частина специфікації ECMAScript 6, і вона поки що не отримала широкої підтримки серед браузерів.
Починаючи з ECMAScript 6, можна визначати власні методи, що використовуються більш короткий синтаксис, схожий на геттери і сеттери. Більш детально - у статті Визначення методів.
Подивіться на наступні приклади:
Функція, певна через конструктор Function і прирівняна до змінної multiply:
Анонімна функція-вираз, прирівняна до змінної multiply:
Функція-вираз з ім'ям func_name. прирівняна до змінної multiply:
У всіх випадках результат приблизно однаковий, але є кілька нюансів:
Ім'я функції і змінна, до якої функція прирівняна - це не одне і те ж. Ім'я функції не можна міняти, а ось змінної, до якої прирівняна функція, можна дати інше значення. У разі функції-вирази з ім'ям, це ім'я може бути використано тільки всередині самої функції. При спробі використовувати його зовні виникне помилка (а якщо раніше була оголошена змінна з таким ім'ям, буде повернуто undefined). наприклад:
Також ім'я фукнции-вирази проявляється, якщо серіалізовать функцію через метод Function.toString.
А ось змінна, до якої функція прирівняна, обмежена тільки власної областю видимості, яка включає ту область, де функція була оголошена.
- Якщо функція визначена за допомогою функції-вирази (function expression), її ім'я є тільки всередині самої функції.
- Якщо функція оголошена (function declaration), її ім'я є в тій області видимості, де функція була визначена.
Так як насправді у функції немає імені, змінну anonymous не можна використовувати всередині функції. Наприклад, наступний приклад викине помилку:
Функція, певна через функцію-вираз, успадковує поточну область видимості, тобто створює замикання. А ось функція, створена за допомогою конструктора Function. не буде наслідувати нічого, крім глобальному контексті (її успадковують взагалі всі функції).
- стає частиною вираження
- не є "вихідним елементом" функції або файлу. Вихідний елемент - це не вкладений елемент всередині функції або скрипта:
Визначення функції в залежності від умови
Функції можуть бути визначені в залежності від умов за допомогою інструкції function (дозволене розширення стандарту ECMA-262 Edition 3) або конструктора Function. Зверніть увагу, що подібні інструкції заборонені в ES5 strict. Крім того, ця можливість по-різному поводиться в різних браузерах, тому не варто на неї розраховувати.
У коді нижче функція zero ніколи не буде визначена і не може бути викликана, тому що 'if (0)' завжди розцінюється як false:
Якщо змінити умова на 'if (1)', функція zero буде визначена.
Приклад: повернення відформатованого числа
Ця функція повертає рядок, що містить число з заданою кількістю нулів перед ним:
Приклад: чи існує функція
Можна визначити, чи існує функція за допомогою оператора typeof. У наступному прикладі перевіряється, чи є у об'єкта window функція noFunc. Якщо є, то вона викликається; якщо немає, виконується якесь інше дію.