function キーワードは、式の中で関数を定義するために使用されます。

Function コンストラクタや 関数宣言で関数を定義することもできます。

構文

function [name]([param1[, param2[, ..., paramN]]]) {
   statements
}

ES2015からはアロー関数も使えます。

引数

name
関数名。省略可。省略した場合、関数は無名関数として認識されます。name は関数内でローカルです。
paramN
関数に渡される引数の名前です。
statements
関数の本体を構成するステートメントです。

説明

関数式は関数宣言とよく似ており、ほとんど同じ書式でもあります(※参照: function宣言 )。関数式と関数宣言の主な相違点は、関数名です。関数式では、匿名関数を生成するために、関数名を省略できます。 関数式は、定義するとすぐに実行する IIFE (即時実行関数)として使用できます。詳細については、 functions の章を見てください。

関数式の巻き上げ

 JavaScript の関数式は、関数宣言と違って巻き上げられません。定義する前に関数式を使用できません:

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

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

名前付き関数式

関数内でその関数自身を参照する必要がある場合は、名前付き関数式にする事でこれを実現できます。この名前は関数内(スコープ)のローカルです。非標準ではありますが、これは arguments.callee を用いて避けることもできます。

var math = {
  'factorial': function factorial(n) {
    if (n <= 1)
      return 1;
    return n * factorial(n - 1);
  }
};

関数式が代入された変数は name プロパティを持ちます。別の変数に代入しても name は変わりません。関数名が省略された場合、変数名になります (暗示的な名前)。関数名がプリセットされたら、それが関数名になります (明示的な名前)。これは アロー関数にもあてはまります (アローは名前がないので変数名を暗示的な名前として与える)。

var foo = function() {}
foo.name // "foo"

var foo2 = foo
foo2.name // "foo"

var bar = function baz() {}
bar.name // "baz"

次の例では、引数の 2 乗を返す無名の関数を定義し、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 で実装。

ブラウザ実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOS 版 SafariSamsung InternetNode.js
基本対応Chrome 完全対応 ありEdge 完全対応 ありFirefox 完全対応 1IE 完全対応 ありOpera 完全対応 ありSafari 完全対応 ありWebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 ありFirefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 ありnodejs 完全対応 あり
Trailing comma in parametersChrome 完全対応 58Edge 未対応 なしFirefox 完全対応 52IE 未対応 なしOpera 完全対応 45Safari 未対応 なしWebView Android 完全対応 58Chrome Android 完全対応 58Edge Mobile 未対応 なしFirefox Android 完全対応 52Opera Android 完全対応 45Safari iOS 未対応 なしSamsung Internet Android 完全対応 7.0nodejs 完全対応 8.0.0

凡例

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

関連情報

ドキュメントのタグと貢献者

このページの貢献者: Uemmra3, YuichiNukiyama, teoli, ethertank, Potappo
最終更新者: Uemmra3,