関数式

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

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

構文

let myFunction = function [name]([param1[, param2[, ..., paramN]]]) {
   statements
};

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

引数

name Optional
関数名。省略可能で、その場合は関数は無名になります。 name は関数本体のみのローカルです。
paramN Optional
関数に渡される引数の名前です。
statements Optional
関数の本体を構成する文です。

解説

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

関数式の巻き上げ

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

console.log(notHoisted) // undefined 
// 変数名は巻き上げが行われますが、定義は行われません。そのため undefined になります。
notHoisted(); // TypeError: notHoisted is not a function

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

名前付き関数式

関数内でその関数自身を参照する必要がある場合は、名前付き関数式を作成する必要があります。この名前は関数本体 (スコープ) に対してのみローカルです。これにより非標準の arguments.callee プロパティの使用も避けられます。

let math = {
  'factit': function factorial(n) {
    console.log(n)
    if (n <= 1) {
      return 1;
    }
    return n * factorial(n - 1);
  }
};

math.factit(3) //3;2;1;

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

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

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

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

console.log(foo === foo2); // true
console.log(typeof baz); // undefined
console.log(bar === baz); // false (errors because baz == undefined)

無名関数の作成

次の例では、無名関数を定義してそれを x に割り当てます。 関数は引数の 2 乗を返します。

var x = function(y) {
   return y * y;
};

関数をコールバックとして使用

より一般的にはコールバックとして使われます。

button.addEventListener('click', function(event) {
    console.log('button is clicked!')
})

仕様書

仕様書
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 完全対応 79Firefox 完全対応 52IE 未対応 なしOpera 完全対応 45Safari 未対応 なしWebView Android 完全対応 58Chrome Android 完全対応 58Firefox Android 完全対応 52Opera Android 完全対応 43Safari iOS 未対応 なしSamsung Internet Android 完全対応 7.0nodejs 完全対応 8.0.0

凡例

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

関連情報