概要
javascriptの関数の呼び出し方法についてまとめます。
関数は定義しただけでは動作しません。
関数の呼び出し方法は、次のように呼び出されます。
・1.関数定義を行い、関数を呼び出す
・2.メソッドとして呼び出す
・3.コンストラクタとして呼び出す
・4.call()、apply()メソッドを使って間接的に呼び出す
以下、関数の呼び出し方法を一つ一つみていきます。
1.関数定義を行い、関数を呼び出す
最も一般的というか、プログラムを実装していて多く見かける書き方です。
前回の投稿でも書いたスタンダードな関数を定義し、それを呼び出す方法です。
具体的には下記のような形になります。
//関数の定義(戻り値はなし) function test1 () { //処理 } //呼び出し test1();
上記の場合、関数test1には引数がないので、呼び出す時にも引数の記述はありません。
引数は状況に応じて書きます。
上記の書き方とは別に、「関数式」で関数を定義し、呼び出す方法は次のようになります。
//関数の定義(戻り値はなし) let test1f = function () { //処理 }; //呼び出し test1f();
上記の関数の書き方は関数名がない無名関数になります。
2.メソッドとして呼び出す
上記の方法とは別に2つめの呼び出し方について調べてみます。
メソッドはオブジェクトのプロパティに保存されている関数を指します。
例えば、関数test2をオブジェクトobj1のメソッドtestmとして定義する場合、次のように書きます。
obj1.testm = test2;
呼び出す時はobj1.testm();で呼び出せます。
また、呼び出し方法は上記の他、
obj1["testm"]();
という書き方をしても同様の意味になります。
3.コンストラクタとして呼び出す
関数呼び出しの前にnewキーワードをつけると、コンストラクタが呼び出されます。
コンストラクタとして呼び出す場合、具体的には次のように書きます。
let obj1 = new Object();
newキーワードを使って、オブジェクトを生成するタイミングで、コンストラクタとして関数が呼び出されます。
コンストラクタは他の言語では、オブジェクトがnewされるタイミングで必ず実行されるメソッド。が存在し、newと同時にそのメソッドが実行される特徴があります。
コンストラクタは他の関数呼び出しやメソッド呼び出しとは違う挙動になります。
コンストラクタ呼び出しの際の、括弧を書いても省略しても、動作には問題はなく、引数を省略すると、引数式が評価されずに関数に渡らない挙動になります。
4.call()、apply()メソッドを使って間接的に呼び出す
関数呼び出しの方法の中で、あまり見かけない(と思う)呼び出し方が「callによる呼び出し」「applyによる呼び出し」になります。
簡単な例をあげると、上記で書いたサンプルのコードがあるとして
//関数の定義(戻り値はなし) let test1f = function () { //処理 }; //呼び出し test1f();
この関数test1f (無名関数)をcallメソッドを使って呼び出してみます。
//関数の定義(戻り値はなし) let test1f = function () { //処理 }; //呼び出し test1f.call();
書き方はほとんど変わらないのですが、呼び出す箇所が「.call()」になっている点が異なります。
また、「applyメソッドによる呼び出し」は次のように書きます。
//関数の定義(戻り値はなし) let test1f = function () { //処理 }; //呼び出し test1f.apply();
見てわかるように、callメソッドの呼び出しと流れは変わりません。
では、この2つの呼び出し方は何が違うのでしょうか。
簡単に言い切ってしまうと、このcallとapplyの両者の違いは、引数にあります。
applyメソッドの引数は、配列で渡す必要があります。
この挙動については、言語仕様に深く関わる点なので、別途取り上げて掘り下げようと思います。