function
キーワードは、式の中で関数を定義するために使用されます。
Function
コンストラクターや関数宣言を用いて関数を定義することもできます。
このデモのソースファイルは GitHub リポジトリに格納されています。デモプロジェクトに協力したい場合は、 https://github.com/mdn/interactive-examples をクローンしてプルリクエストを送信してください。
構文
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!')
})
仕様書
ブラウザーの互換性
BCD tables only load in the browser
このページの互換性一覧表は構造化データから生成されています。データに協力していただけるのであれば、 https://github.com/mdn/browser-compat-data をチェックアウトしてプルリクエストを送信してください。