関数の作成(定義)と実行
関数の作成(定義)
関数を作成(定義)するには、Function
オブジェクトまたは、function
文を使用します。
さらにfunction文を使用した関数式(関数リテラル)と、ECMAScript 2015(ES6)で追加されたアロー関数式を使用した定義も行うことができます。
構文
// Functionオブジェクトの場合
var func = new Function(argumentN[, argumentN ...], functionStatements);
// function文の場合
function name([paramN[, paramN ...]]) {
statements
}
// 関数式(関数リテラル)の場合
var func = function([paramN[, paramN ...]]) {
statements
};
// アロー関数式
([paramN[, paramN ...]]) => {
statements
};
// または
var func = ([paramN[, paramN ...]]) => {
statements
};
引数 | argumentN | 関数の処理statementsに渡す引数の名前 |
---|---|---|
最終引数 | functionStatements | 実行する処理 |
戻り値 | func | 生成された関数 |
引数 | paramN | 関数の処理statementsに渡す引数の名前 |
関数名 | name | 関数に付ける名前 付けなくてもよい |
処理 | statements | 実行する処理 |
サンプルコード
JavaScript
// Functionオブジェクトでの定義の場合
var foo = new Function(a, b, 'return a + b');
// function文での定義の場合
function foo(a, b) {
return a + b;
}
// function文を使用して関数(無名関数)を変数に代入し定義する場合(関数式)
var foo = function(a, b) {
return a + b;
};
// アロー関数式での定義の場合
var foo = (a, b) => {
return a + b;
};
作成(定義)した関数の実行
作成(定義)した関数を実行を行うには、次のように関数名()
とすることで実行できます。
丸括弧内には関数に渡したい値(引数)を指定します。
JavaScript
// 引数なし
var result = foo();
// 引数あり
var result = foo(1, 2);
なお、引数の有無のチェックを行わないと、エラーとなる場合があるので注意する必要があります。
アロー関数式について
アロー関数式は、いくつかの特徴があります。
- 今までより短く書くことができる
- 引数が1つの場合は丸括弧が省略できる
- 1行でreturn文やブロック(中括弧)を省略できる
- thisは親のスコープになる
- newよるインスタンス生成(コンストラクタ呼び出し)ができない
今までより短く書くことができる
冒頭のサンプルコードにもありました通り、function文などよりも短く書くことができます。
// function文
var foo = function(a, b) {
return a + b;
};
// アロー関数式
var foo = (a, b) => {
return a + b;
};
引数が1つの場合は丸括弧が省略できる
定義の際に引数が1つしかない場合は丸括弧を省略することができます。
ただし、スプレッド構文...
を使用する場合は省略することはできません。
// 省略しない
var foo = (a) => {
処理
};
// 省略する
var foo = a => {
処理
};
// 省略するスプレッド構文
var foo = (...args) => {
処理
};
1行でreturn文やブロック(中括弧)を省略できる
関数内の処理が1行として読めるコードでreturn文で値を返している場合は、return文とブロック(中括弧)を省略することができます。
// 省略しない
var foo = (a, b) => {
return a + b;
};
// 省略する
var foo = (a, b) => a + b;
thisは親のスコープになる
通常関数は実行するタイミングでthisが定められるため、メソッドなどはその所属するオブジェクトを返したり、bindメソッドなどによって指定したthisを返します。
var foo = {
bar : function() {
console.log(this);
}
};
foo.bar(); // foo
しかしアロー関数式ではthisは定義している関数の親であるthisの値を返します。
var foo = {
bar : () => {
console.log(this);
}
};
foo.bar(); // Window
bar関数の親であるfooオブジェクトはthisがWindowオブジェクトであるためWindowオブジェクトを返します。
なので、bindメソッドなどでthisを強制的に任意の値に指定してもその値を返しません。
// function文
var foo = {
bar : function() {
console.log(this);
}
};
foo.bar = foo.bar.bind(123);
foo.bar(); // 123(正確にはNumberオブジェクトの値)
// アロー関数式
var foo = {
bar : () => {
console.log(this);
}
};
foo.bar = foo.bar.bind(123);
foo.bar(); // Window
newよるインスタンス生成(コンストラクタ呼び出し)ができない
アロー関数式はnewによるインスタンスの生成(コンストラクタの呼び出し)ができません。
// function文
var foo = function() {
処理
};
new foo(); // Object
// アロー関数式
var foo = () => {
処理
};
new foo(); // エラー