Функції - javascript, mdn

У загальному випадку, функція - це "підпрограма", яку можна викликати з зовнішнього (або внутрішнього, в разі рекурсії) по відношенню до функції коду. Як і сама програма, функція складається з послідовності інструкцій, званої тілом функції. Значення можуть бути передані в функцію, а функція поверне значення.

Функції - це не процедури. Функція завжди повертає значення, а процедура може повертати, а дозволяють залишати.

Щоб повернути значення, відмінне від значення за замовчуванням, в функції повинна бути інструкція 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.

А ось змінна, до якої функція прирівняна, обмежена тільки власної областю видимості, яка включає ту область, де функція була оголошена.

  1. Якщо функція визначена за допомогою функції-вирази (function expression), її ім'я є тільки всередині самої функції.
  2. Якщо функція оголошена (function declaration), її ім'я є в тій області видимості, де функція була визначена.

Так як насправді у функції немає імені, змінну anonymous не можна використовувати всередині функції. Наприклад, наступний приклад викине помилку:

Функція, певна через функцію-вираз, успадковує поточну область видимості, тобто створює замикання. А ось функція, створена за допомогою конструктора Function. не буде наслідувати нічого, крім глобальному контексті (її успадковують взагалі всі функції).

  • стає частиною вираження
  • не є "вихідним елементом" функції або файлу. Вихідний елемент - це не вкладений елемент всередині функції або скрипта:

Визначення функції в залежності від умови

Функції можуть бути визначені в залежності від умов за допомогою інструкції function (дозволене розширення стандарту ECMA-262 Edition 3) або конструктора Function. Зверніть увагу, що подібні інструкції заборонені в ES5 strict. Крім того, ця можливість по-різному поводиться в різних браузерах, тому не варто на неї розраховувати.

У коді нижче функція zero ніколи не буде визначена і не може бути викликана, тому що 'if (0)' завжди розцінюється як false:

Якщо змінити умова на 'if (1)', функція zero буде визначена.

Приклад: повернення відформатованого числа

Ця функція повертає рядок, що містить число з заданою кількістю нулів перед ним:

Приклад: чи існує функція

Можна визначити, чи існує функція за допомогою оператора typeof. У наступному прикладі перевіряється, чи є у об'єкта window функція noFunc. Якщо є, то вона викликається; якщо немає, виконується якесь інше дію.

специфікації

Схожі статті