--- title: 関数式 slug: Web/JavaScript/Reference/Operators/function tags: - Function - JavaScript - Language feature - Operator - Primary Expressions - 演算子 - 言語機能 translation_of: Web/JavaScript/Reference/Operators/function ---
{{jsSidebar("Operators")}}

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

{{jsxref("Function/Function", "Function")}} コンストラクターや{{jsxref("Statements/function", "関数宣言", "", 1)}}を用いて関数を定義することもできます。

{{EmbedInteractiveExample("pages/js/expressions-functionexpression.html", "shorter")}}

構文

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

ES2015 からは{{jsxref("Functions/Arrow_functions", "アロー関数", "", 1)}}も使えます。

引数

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

解説

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

関数式の巻き上げ

JavaScript の関数式は、{{jsxref("Statements/function", "関数宣言", "#Function_declaration_hoisting", 1)}}と違って巻き上げられません。定義前に関数式を使用することはできません。

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

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

名前付き関数式

関数内でその関数自身を参照する必要がある場合は、名前付き関数式を作成する必要があります。この名前は関数本体 (スコープ) に対してのみローカルです。これにより非標準の {{jsxref("Functions/arguments/callee", "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な名前)。関数名が存在したら、それが関数名になります (明示的な名前)。これは{{jsxref("Functions/Arrow_functions", "アロー関数", "", 1)}}にもあてはまります (アローは名前がないので変数名を暗黙的な名前として与える)。

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;
};

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

より一般的には{{Glossary("Callback_function", "コールバック")}}として使われます。

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

仕様書

仕様書
{{SpecName('ESDraft', '#sec-function-definitions', 'Function definitions')}}

ブラウザーの互換性

{{Compat("javascript.operators.function")}}

関連情報