Вираз function

Ключове слово function (функція) можна використовувати для визначення функції всередині виразу.

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

Спробуйте його в дії

Синтаксис

function (param0) {
  інструкції
}
function (param0, param1) {
  інструкції
}
function (param0, param1, /* …, */ paramN) {
  інструкції
}

function name(param0) {
  інструкції
}
function name(param0, param1) {
  інструкції
}
function name(param0, param1, /* …, */ paramN) {
  інструкції
}

[!NOTE] Запис інструкції-виразу не може починатися зі слова function, щоб уникнути плутанини щодо оголошення функції. Ключове слово function починає вираз тільки тоді, коли з'являється в контексті, де інструкцій бути не може.

Параметри

name Необов'язкове

Ім'я функції. Можна опустити, і в цьому випадку функція буде анонімною. Ім'я є локальним лише для тіла функції.

paramN Необов'язкове

Назва формального параметра для функції. Синтаксис параметрів дивіться у Довідці про функції.

statements Необов'язкове

Інструкції, що утворюють тіло функції.

Опис

Вираз function дуже схожий та має практично той самий синтаксис, що й оголошення function. Основна відмінність між виразом function та оголошенням function полягає в імені функції, яке можна опустити у виразі функції, створивши її анонімною. Вираз function можна використовувати як IIFE (зразу закличний вираз функції), функцію, яка запускається одразу після визначення. Дивіться докладніше в розділі про функції.

Підняття виразу функції

Вирази функцій у JavaScript не мають підняття, на відміну від оголошень функцій. Не можна використовувати вирази функцій до їх створення:

console.log(notHoisted); // undefined
// Незважаючи на те, що назва змінної піднімається,
// визначення - ні. Тому це undefined.
notHoisted(); // TypeError: notHoisted is not a function

var notHoisted = function () {
  console.log("bar");
};

Іменований вираз функції

Якщо ви хочете посилатися на поточну функцію всередині її тіла, потрібно створити іменований вираз функції. Це ім'я буде локальним лише для тіла функції (її області видимості). Це дає змогу не використовувати для рекурсивного виклику функції нерекомендовану властивість arguments.callee.

const math = {
  factorial: function factorial(n) {
    console.log(n);
    if (n <= 1) {
      return 1;
    }
    return n * factorial(n - 1);
  },
};

math.factorial(3); //3;2;1;

Якщо вираз функції є іменованим, властивість функції name встановлюється як її ім'я, замість неявного імені, виведеного з синтаксису (наприклад, змінна, до якої присвоюється функція).

На відміну від оголошення функції, ім'я виразу функції доступне лише для читання.

function foo() {
  foo = 1;
}
foo();
console.log(foo); // 1
(function foo() {
  foo = 1; // TypeError: Assignment to constant variable.
})();

Приклади

Використання виразу функції

У наступному прикладі визначається та присвоюється сталій x функція без імені. Ця функція повертає квадрат свого аргументу:

const x = function (y) {
  return y * y;
};

Використання функції як зворотного виклику

Найчастіше такі функції використовуються як функції зворотного виклику:

button.addEventListener("click", function (event) {
  console.log("кнопку клацнуто!");
});

Використання зразу закличного виразу функції (IIFE)

Створюється та викликається анонімна функція:

(function () {
  console.log("Код працює!");
})();

// або

!function () {
  console.log("Код працює!");
}();

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

Сумісність із браузерами

desktop mobile server
Chrome Edge Firefox Internet Explorer Opera Safari WebView Android Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet Deno Node.js
function expression
Chrome Full support 1
Edge Full support 12
Firefox Full support 1
Internet Explorer Full support 3
Opera Full support 3
Safari Full support 1
WebView Android Full support 1
Chrome Android Full support 18
Firefox for Android Full support 4
Opera Android Full support 10.1
Safari on iOS Full support 1
Samsung Internet Full support 1.0
Deno Full support 1.0
Node.js Full support 0.10.0
Trailing comma in parameters
Chrome Full support 58
Edge Full support 14
Firefox Full support 52
Internet Explorer No support Ні
Opera Full support 45
Safari Full support 10
WebView Android Full support 58
Chrome Android Full support 58
Firefox for Android Full support 52
Opera Android Full support 43
Safari on iOS Full support 10
Samsung Internet Full support 7.0
Deno Full support 1.0
Node.js Full support 8.0.0

Дивіться також