function

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Die function-Deklaration erstellt eine Bindung einer neuen Funktion zu einem gegebenen Namen.

Sie können auch Funktionen mithilfe des function Ausdrucks definieren.

Probieren Sie es aus

Syntax

js
function name(param0) {
  statements
}
function name(param0, param1) {
  statements
}
function name(param0, param1, /* …, */ paramN) {
  statements
}

Parameter

name

Der Funktionsname.

param Optional

Der Name eines formalen Parameters für die Funktion. Die maximale Anzahl von Argumenten variiert in verschiedenen Engines. Für die Syntax der Parameter siehe die Funktionsreferenz.

statements Optional

Die Anweisungen, die den Funktionskörper ausmachen.

Beschreibung

Eine function-Deklaration erstellt ein Function-Objekt. Jedes Mal, wenn eine Funktion aufgerufen wird, gibt sie den Wert zurück, der durch die letzte ausgeführte return-Anweisung angegeben ist, oder undefined, wenn das Ende des Funktionskörpers erreicht wird. Siehe Funktionen für detaillierte Informationen zu Funktionen.

function-Deklarationen verhalten sich wie eine Mischung aus var und let:

  • Wie let, im strikten Modus, sind Funktionsdeklarationen auf den am nächsten enthaltenen Block beschränkt.
  • Wie let können Funktionsdeklarationen auf höchster Ebene eines Moduls oder innerhalb von Blöcken im strikten Modus nicht durch andere Deklarationen erneut deklariert werden.
  • Wie var werden Funktionsdeklarationen auf höchster Ebene eines Skripts (strikt oder nicht strikt) zu Eigenschaften von globalThis. Funktionsdeklarationen auf höchster Ebene eines Skripts oder Funktionskörpers (strikt oder nicht strikt) können durch eine andere function oder var erneut deklariert werden.
  • Wie beide, können Funktionsdeklarationen neu zugewiesen werden, aber Sie sollten dies vermeiden.
  • Anders als bei beiden werden Funktionsdeklarationen gehoben zusammen mit ihrem Wert und können überall in ihrem Geltungsbereich aufgerufen werden.

Block-Level-Funktionsdeklaration

Warnung: Im nicht-strikten Modus verhalten sich Funktionsdeklarationen innerhalb von Blöcken seltsam. Deklarieren Sie nur Funktionen in Blöcken, wenn Sie im strikten Modus sind.

Funktionen können bedingt deklariert werden — das heißt, eine Funktionsanweisung kann innerhalb einer if-Anweisung verschachtelt werden. Im nicht-strikten Modus sind die Ergebnisse jedoch je nach Implementierung inkonsistent.

js
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

Die Wirkung der Geltungsbereichs- und Hebungsmechanismen ändert sich nicht, unabhängig davon, ob der if-Block tatsächlich ausgeführt wird.

js
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

Im strikten Modus sind Funktionsdeklarationen auf Block-Ebene auf diesen Block beschränkt und werden an die Spitze des Blocks gehoben.

js
"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

Funktionsdeklarationen in JavaScript werden in den oberen Teil der umgebenden Funktion oder des globalen Geltungsbereichs gehoben. Sie können die Funktion verwenden, bevor Sie sie deklariert haben:

js
hoisted(); // Logs "foo"

function hoisted() {
  console.log("foo");
}

Beachten Sie, dass Funktionsausdrücke nicht gehoben werden:

js
notHoisted(); // TypeError: notHoisted is not a function

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

Redeclarations

Ob function-Deklarationen im gleichen Geltungsbereich erneut deklariert werden können, hängt davon ab, in welchem Geltungsbereich sie sich befinden.

Auf der obersten Ebene eines Skripts verhalten sich function-Deklarationen wie var und können durch eine andere function oder var, aber nicht durch let, const oder class erneut deklariert werden.

js
function a(b) {}
function a(b, c) {}
console.log(a.length); // 2
let a = 2; // SyntaxError: Identifier 'a' has already been declared

Wenn function-Deklarationen durch var erneut deklariert werden, überschreibt der Initialisierer der var-Deklaration immer den Funktionswert, unabhängig von ihrer relativen Position. Dies liegt daran, dass Funktionsdeklarationen vor jeder Initialisierungsbewertung gehoben werden, sodass die Initialisierung später kommt und den Wert überschreibt.

js
var a = 1;
function a() {}
console.log(a); // 1

Auf der obersten Ebene des Funktionskörpers verhält sich function ebenfalls wie var und kann erneut deklariert werden oder denselben Namen wie ein Parameter haben.

js
function foo(a) {
  function a() {}
  console.log(typeof a);
}

foo(2); // Logs "function"

Auf der obersten Ebene eines Moduls oder eines Blocks im strikten Modus verhalten sich function-Deklarationen wie let und können nicht durch eine andere Deklaration erneut deklariert werden.

js
// Assuming current source is a module
function foo() {}
function foo() {} // SyntaxError: Identifier 'foo' has already been declared
js
"use strict";
{
  function foo() {}
  function foo() {} // SyntaxError: Identifier 'foo' has already been declared
}

Eine function-Deklaration innerhalb eines catch-Blocks kann nicht denselben Namen wie der durch catch gebundene Bezeichner haben, auch nicht im nicht-strikten Modus.

js
try {
} catch (e) {
  function e() {} // SyntaxError: Identifier 'e' has already been declared
}

Beispiele

Verwendung von function

Der folgende Code deklariert eine Funktion, die den Gesamtumsatz zurückgibt, wenn die Anzahl der verkauften Einheiten von drei Produkten angegeben wird.

js
function calcSales(unitsA, unitsB, unitsC) {
  return unitsA * 79 + unitsB * 129 + unitsC * 699;
}

Spezifikationen

Specification
ECMAScript Language Specification
# sec-function-definitions

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch