関数宣言

関数宣言(関数文)は、指定されたパラメーターを使用して関数を定義します。

また、関数のコンストラクターと関数式を使用して関数を定義することもできます。

構文

function name([param[, param,[..., param]]]) {
   [statements]
}
name
関数の名前です。
param Optional
関数に渡す引数の名前です。引数の最大数はエンジンによって異なります。
statements Optional
関数の本体を構成する文です。

説明

関数宣言で作成された関数は、Function オブジェクトであり、Function オブジェクトのすべてのプロパティ、メソッド、動作を備えています。Function の詳細については Function を参照してください。

関数は式を使用して作成することもできます。(関数式を参照)

既定では、関数は undefined を返します。他の値を返すには、関数に返す値を指定する return 文が必要です。

条件付きの関数を作成する

関数は条件付きで宣言できます。つまり、関数文を if 文の中に入れ子にすることができますが、結果は実装によって一貫性がないので、このパターンを本番コードでは使用すべきではありません。条件付きの関数の作成には、代わりに関数式を使用してください。

var hoisted = "foo" in this;
console.log(`'foo' name ${hoisted ? "is" : "is not"} hoisted. typeof foo is ${typeof foo}`);
if (false) {
  function foo(){ return 1; }
}

// In Chrome: 
// 'foo' name is hoisted. typeof foo is undefined
// 
// In Firefox:
// 'foo' name is hoisted. typeof foo is undefined
//
// In Edge:
// 'foo' name is not hoisted. typeof foo is undefined
// 
// In Safari:
// 'foo' name is hoisted. typeof foo is function

真と評価される条件でも結果はまったく同じです。

var hoisted = "foo" in this;
console.log(`'foo' name ${hoisted ? "is" : "is not"} hoisted. typeof foo is ${typeof foo}`);
if (true) {
  function foo(){ return 1; }
}

// In Chrome: 
// 'foo' name is hoisted. typeof foo is undefined
// 
// In Firefox:
// 'foo' name is hoisted. typeof foo is undefined
//
// In Edge:
// 'foo' name is not hoisted. typeof foo is undefined
// 
// In Safari:
// 'foo' name is hoisted. typeof foo is function

関数宣言の巻き上げ

JavaScript の関数宣言は、それを囲む関数やグローバルスコープの先頭に巻き上げられ、関数を宣言する前に使うことができます。

hoisted(); // logs "foo"

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

関数式は巻き上げられないことに注意してください。

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

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

function を使用する

以下のコードは、商品 a, b, c の販売個数が与えられた場合に、販売個数の合計を返す関数を宣言しています。

function calc_sales(units_a, units_b, units_c) {
   return units_a * 79 + units_b * 129 + units_c * 699;
}

仕様

仕様書
ECMAScript (ECMA-262)
Function definitions の定義

ブラウザー実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
functionChrome 完全対応 1Edge 完全対応 12Firefox 完全対応 1IE 完全対応 3Opera 完全対応 3Safari 完全対応 1WebView Android 完全対応 1Chrome Android 完全対応 18Firefox Android 完全対応 4Opera Android 完全対応 10.1Safari iOS 完全対応 1Samsung Internet Android 完全対応 1.0nodejs 完全対応 0.1.100
Trailing comma in parametersChrome 完全対応 58Edge 完全対応 14Firefox 完全対応 52IE 未対応 なしOpera 完全対応 45Safari 完全対応 10WebView Android 完全対応 58Chrome Android 完全対応 58Firefox Android 完全対応 52Opera Android 完全対応 43Safari iOS 完全対応 10Samsung Internet Android 完全対応 7.0nodejs 完全対応 8.0.0

凡例

完全対応  
完全対応
未対応  
未対応

関連情報