Ключевое слово function
может использоваться для определения функции внутри выражения.
Вы можете также определять функции используя конструктор Function
и объявление функции
.
Синтаксис
var myFunction = function [name]([param1[, param2[, ..., paramN]]]) { statements };
С версии ES2015 можно также использовать стрелочные функции.
Параметры
name
- Имя функции. Может быть опущено, в таком случае функция является анонимной. Имя функции является локальным только для её тела.
paramN
- Имя аргумента, передаваемого в функцию.
statements
- Инструкции, составляющие тело функции.
Описание
Функциональное выражение и объявление функции очень похожи и имеют почти одинаковый синтаксис. Главным отличием между ними является имя функции, которое в случае функциональных выражений может быть опущено для создания анонимных функций. Функциональное выражение может быть использовано для создания самовызывающейся функции (IIFE), которая исполняется сразу же после того, как она была определена. Более подробная информация изложена в разделе о функциях.
Поднятие функциональных выражений
Функциональные выражения в JavaScript не поднимаются (hoisting), в отличие от объявленных функций
. Вы не можете использовать функциональные выражения прежде, чем вы их определили.
console.log(notHoisted) // 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 (errors because baz == undefined)
Примеры
Следующий пример демонстрирует создание безымянной (анонимной) функции и присвоение её переменной x
. Функция возвращает квадрат переданного значения:
var x = function (y) { return y * y; };
Преимущественно анонимные функции используются как функции обратного вызова.
button.addEventListener('click', function(event) { console.log('button is clicked!') });
Спецификации
Спецификация | Статус | Комментарий |
---|---|---|
ECMAScript Latest Draft (ECMA-262) Определение 'Function definitions' в этой спецификации. |
Черновик | |
ECMAScript 2015 (6th Edition, ECMA-262) Определение 'Function definitions' в этой спецификации. |
Стандарт | |
ECMAScript 5.1 (ECMA-262) Определение 'Function definition' в этой спецификации. |
Стандарт | |
ECMAScript 3rd Edition (ECMA-262) Определение 'Function definition' в этой спецификации. |
Стандарт | Изначальное определение. Реализовано в JavaScript 1.5. |
Совместимость с браузерами
Компьютеры | Мобильные | Server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
function | Chrome Полная поддержка Да | Edge Полная поддержка Да | Firefox Полная поддержка 1 | IE Полная поддержка Да | Opera Полная поддержка Да | Safari Полная поддержка Да | WebView Android Полная поддержка Да | Chrome Android Полная поддержка Да | Edge Mobile Полная поддержка Да | Firefox Android Полная поддержка 4 | Opera Android Полная поддержка Да | Safari iOS Полная поддержка Да | Samsung Internet Android Полная поддержка Да | nodejs Полная поддержка Да |
Trailing comma in parameters | Chrome Полная поддержка 58 | Edge Нет поддержки Нет | Firefox Полная поддержка 52 | IE Нет поддержки Нет | Opera Полная поддержка 45 | Safari Нет поддержки Нет | WebView Android Полная поддержка 58 | Chrome Android Полная поддержка 58 | Edge Mobile Нет поддержки Нет | Firefox Android Полная поддержка 52 | Opera Android Полная поддержка 45 | Safari iOS Нет поддержки Нет | Samsung Internet Android Полная поддержка 7.0 | nodejs Полная поддержка 8.0.0 |
Легенда
- Полная поддержка
- Полная поддержка
- Нет поддержки
- Нет поддержки