Функціональний вираз

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

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

Синтаксис

var myFunction = function [name]([param1[, param2[, ..., paramN]]]) {
   statements
};

Починаючи з ES2015 ви також можете скористатись стрілковими функціями.

Параметри

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

Опис

Функціональний вираз дуже схожий на оголошення функції та має майже такий самий синтаксис (дивіться оголошення функції). Головна відмінність між функціональним виразом та оголошенням функції - це ім'я функції, яке може бути пропущене у функціональних виразах для створення анонімних функцій. Функціональний вираз можна використовувати як НВФВ (Негайно виконуваний функціональний вираз), який запускається одразу після визначення. Дивіться також главу про функції, щоб дізнатись більше.

Підняття функціонального виразу

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

console.log(notHoisted) // undefined 
//хоча імена змінних піднімаються, визначення не піднімається і дорівнює undefined.
notHoisted(); // TypeError: notHoisted is not a function

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

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

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

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

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

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

var foo = function() {}
foo.name // "foo"

var foo2 = foo
foo2.name // "foo"

var bar = function baz() {}
bar.name // "baz"

console.log(foo === foo2); // true
console.log(typeof baz); // undefined
console.log(bar === baz); // false (помилка, тому що baz == undefined)

Приклади

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

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

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

button.addEventListener('click', function(event) {
    console.log('кнопка натиснута!')
})

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

Специфікація Статус Коментар
ECMAScript Latest Draft (ECMA-262)
The definition of 'Function definitions' in that specification.
Draft
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Function definitions' in that specification.
Standard
ECMAScript 5.1 (ECMA-262)
The definition of 'Function definition' in that specification.
Standard
ECMAScript 3rd Edition (ECMA-262)
The definition of 'Function definition' in that specification.
Standard Початкове визначення. Реалізоване у JavaScript 1.5.

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
functionChrome Full support 1Edge Full support 12Firefox Full support 1IE Full support 3Opera Full support YesSafari Full support YesWebView Android Full support 1Chrome Android Full support 18Firefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support 1.0nodejs Full support Yes
Trailing comma in parametersChrome Full support 58Edge No support NoFirefox Full support 52IE No support NoOpera Full support 45Safari No support NoWebView Android Full support 58Chrome Android Full support 58Firefox Android Full support 52Opera Android Full support 43Safari iOS No support NoSamsung Internet Android Full support 7.0nodejs Full support 8.0.0

Legend

Full support  
Full support
No support  
No support

Див. також