Spec-Zone.ru › JavaScript

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;
}

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

Спецификация
Спецификация языка ECMAScript® 2027
# sec-function-definitions

Совместимость с браузерами

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

См. также

  • Руководство по функциям
  • Функции
  • Function
  • function выражение
  • function*
  • async function
  • async 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API