function
Базовый уровень Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
Объявление function создает привязку новой функции к заданному имени.
Вы также можете определять функции, используя function выражение.
Попробуйте
function calcRectArea(width, height) {
return width * height;
}
console.log(calcRectArea(5, 6));
// Expected output: 30
Синтаксис
function name(param0) {
statements
}
function name(param0, param1) {
statements
}
function name(param0, param1, /* …, */ paramN) {
statements
}
Параметры
-
name - Имя функции.
-
paramНеобязательно - Имя формального параметра для функции. Максимальное количество аргументов варьируется в разных движках. Синтаксис параметров см. в справочнике по функциям.
-
statementsНеобязательно - Операторы, составляющие тело функции.
Описание
Объявление function создает Function объект. При каждом вызове функции она возвращает значение, указанное последним выполненным return оператором, или undefined, если достигнут конец тела функции. Подробную информацию о функциях см. в разделе функции.
Объявления function ведут себя как смесь var и let:
- Как и
let, в строгом режиме область видимости объявлений функций ограничивается наиболее близким включающим блоком. - Как и
let, объявления функций на верхнем уровне модуля или внутри блоков в строгом режиме не могут быть переобъявлены никаким другим объявлением. - Как и
var, объявления функций на верхнем уровне скрипта (строгого или нестрогого) становятся свойствамиglobalThis. Объявления функций на верхнем уровне скрипта или тела функции (строгого или нестрогого) могут быть переобъявлены с помощью другогоfunctionилиvar. - Как и оба, объявления функций могут быть переназначены, но этого следует избегать.
- В отличие от обоих, объявления функций поднимаются (hoisted) вместе со своим значением и могут быть вызваны в любой точке своей области видимости.
Объявление функции на уровне блока
Внимание: В нестрогом режиме объявления функций внутри блоков ведут себя странно. Объявляйте функции в блоках только в том случае, если вы находитесь в строгом режиме.
Функции могут быть объявлены условно — то есть, оператор функции может быть вложен в оператор if. Однако в нестрогом режиме результаты непостоянны в разных реализациях.
console.log(
`'foo' name ${
"foo" in globalThis ? "is" : "is not"
} global. typeof foo is ${typeof foo}`,
);
if (false) {
function foo() {
return 1;
}
}
// In Chrome:
// 'foo' name is global. typeof foo is undefined
//
// In Firefox:
// 'foo' name is global. typeof foo is undefined
//
// In Safari:
// 'foo' name is global. typeof foo is function
Эффект области видимости и поднятия не изменится независимо от того, будет ли фактически выполнено тело if.
console.log(
`'foo' name ${
"foo" in globalThis ? "is" : "is not"
} global. typeof foo is ${typeof foo}`,
);
if (true) {
function foo() {
return 1;
}
}
// In Chrome:
// 'foo' name is global. typeof foo is undefined
//
// In Firefox:
// 'foo' name is global. typeof foo is undefined
//
// In Safari:
// 'foo' name is global. typeof foo is function
В строгом режиме объявления функций на уровне блока ограничены областью видимости этого блока и поднимаются в начало блока.
"use strict";
{
foo(); // Logs "foo"
function foo() {
console.log("foo");
}
}
console.log(
`'foo' name ${
"foo" in globalThis ? "is" : "is not"
} global. typeof foo is ${typeof foo}`,
);
// 'foo' name is not global. typeof foo is undefined
Поднятие (Hoisting)
Объявления функций в JavaScript поднимаются (hoisted) в начало включающей функции или глобальной области видимости. Вы можете использовать функцию до того, как объявили её:
hoisted(); // Logs "foo"
function hoisted() {
console.log("foo");
}
Обратите внимание, что выражения функций не поднимаются:
notHoisted(); // TypeError: notHoisted is not a function
var notHoisted = function () {
console.log("bar");
};
Переобъявления
Возможность переобъявления function в той же области видимости зависит от того, какую область видимости они содержат.
На верхнем уровне скрипта объявления function ведут себя как var и могут быть переобъявлены с помощью другого function или var, но не с помощью let, const или class.
function a(b) {}
function a(b, c) {}
console.log(a.length); // 2
let a = 2; // SyntaxError: Identifier 'a' has already been declared
Когда объявления function переобъявляются с помощью var, инициализатор объявления var всегда переопределяет значение функции, независимо от их относительного положения. Это связано с тем, что объявления функций поднимаются до того, как будет оценен какой-либо инициализатор, поэтому инициализатор приходит позже и переопределяет значение.
var a = 1;
function a() {}
console.log(a); // 1
На верхнем уровне тела функции function также ведет себя как var и может быть переобъявлено или иметь то же имя, что и параметр.
function foo(a) {
function a() {}
console.log(typeof a);
}
foo(2); // Logs "function"
На верхнем уровне модуля или блока в строгом режиме объявления function ведут себя как let и не могут быть переобъявлены никаким другим объявлением.
// Assuming current source is a module
function foo() {}
function foo() {} // SyntaxError: Identifier 'foo' has already been declared
"use strict";
{
function foo() {}
function foo() {} // SyntaxError: Identifier 'foo' has already been declared
}
Объявление function внутри блока catch не может иметь то же имя, что и связанный идентификатор catch, даже в нестрогом режиме.
try {
} catch (e) {
function e() {} // SyntaxError: Identifier 'e' has already been declared
}
Примеры
Использование function
Следующий код объявляет функцию, которая возвращает общую сумму продаж при условии, что ей передано количество проданных единиц трех продуктов.
function calcSales(unitsA, unitsB, unitsC) {
return unitsA * 79 + unitsB * 129 + unitsC * 699;
}
Спецификации
Совместимость с браузерами
| Desktop | Mobile | Server | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
function |
1 |
12 |
1 |
3 |
1 |
18 |
4 |
10.1 |
1 |
1.0 |
4.4 |
1 |
1.0.0 |
1.0 |
0.10.0 |
trailing_comma_in_parameters |
58 |
14 |
52 |
45 |
10 |
58 |
52 |
43 |
10 |
7.0 |
58 |
10 |
1.0.0 |
1.0 |
8.0.0 |
См. также
- Руководство по функциям
- Функции
Functionfunctionвыражениеfunction*async functionasync function*
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function