function
キーワードは、式の中で関数を定義するために使用されます。
Function
コンストラクタや 関数宣言
で関数を定義することもできます。
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
構文
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!')
})
仕様
ブラウザ実装状況
デスクトップ | モバイル | サーバー | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
基本対応 | Chrome 完全対応 あり | Edge 完全対応 あり | Firefox 完全対応 1 | IE 完全対応 あり | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 あり | Chrome Android 完全対応 あり | Edge Mobile 完全対応 あり | Firefox Android 完全対応 4 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 あり | nodejs 完全対応 あり |
Trailing comma in parameters | Chrome 完全対応 58 | Edge 未対応 なし | Firefox 完全対応 52 | IE 未対応 なし | Opera 完全対応 45 | Safari 未対応 なし | WebView Android 完全対応 58 | Chrome Android 完全対応 58 | Edge Mobile 未対応 なし | Firefox Android 完全対応 52 | Opera Android 完全対応 45 | Safari iOS 未対応 なし | Samsung Internet Android 完全対応 7.0 | nodejs 完全対応 8.0.0 |
凡例
- 完全対応
- 完全対応
- 未対応
- 未対応