関数オブジェクトとは?関数オブジェクトについて調べてみた。

画像

JavaScriptを学ぶうえでオブジェクトの学習は必要不可欠です。オブジェクトについて色々と調べたところ関数は( )で実行可能なオブジェクトだということを知りました。ここでは関数オブジェクトについて色々調べてみた結果を自分なりにまとめてみました。

もくじ

  1. 関数は( )で実行可能なオブジェクト
  2. 関数の実行と参照の違い
  3. 関数とオブジェクトは仲間です
  4. 結局、関数オブジェクトとは何か?

関数は( )で実行可能なオブジェクト

JavaScriptを学ぶうえでオブジェクトの学習は必要不可欠です。オブジェクトについて色々と調べたところ関数は( )で実行可能なオブジェクトだということを知りました。

その言葉の本質的な意味を全く理解することができずに関数とオブジェクトの違いについて悩む日々が続くことになる。

関数とオブジェクトの違いを探ろうとサンプルコードを作成してみました。このコードでは関数とオブジェクトの違いを確かめるコードとなってます。

obj.js
var obj1 = { a: 100 };
var obj2 = function() { return 100 };
obj1.b = 10;
obj2.b = 20;

obj1(); // エラー発生
obj2(); // 100

このプログラムについて簡潔に解説すると、関数は( )で実行可能なオブジェクトであるため、( )で実行すれば値が返ってくる仕様となってます。

それぞれのオブジェクトの挙動を確認するため obj1 と obj2 という名前のオブジェクトを用意しました。 obj2 の中には関数が格納されてます。なので、obj2( )で実行すれば return で返した 100 という処理が実行されます。

しかし、obj1 はエラーとなります。エラーとなる原因は obj1 は関数ではないからです。関数ではないオブジェクトは、( )で実行することはできません。プログラミング初学者がこの意味を理解することは相当ハードル高いと感じます。

obj.js
obj1(); // obj 1 is not a function "obj1は関数ではありません"

今まで教科書通りにやってると関数とオブジェクトは別物だと覚えがちでしたが、実際に処理を試した結果、実は関数とオブジェクトは仲間だったということが判明します。なので、今日からは関数とオブジェクトは仲間だと覚えてください。

何度もくどいようですが、関数は( )で実行可能なオブジェクトです。

関数の実行と参照の違い

関数の実行と参照の違いについて軽く触れときます。「実行」と「参照」は言葉のニュアンス的には似ているなと思われがちですがプログラムの世界では全く違う意味となります。

関数の実行とは言葉の通り関数の処理を実行させることです。実行させることでプログラム処理を動かすことができます。関数の処理を実行したい時は( )を使い実行させましょう。

関数の参照とは関数の値を照らし合わせる意味となります。関数の中にどんな値が入っているのかを確認することができます。ただ、あくまでも関数の中身を確認するだけであり、処理を実行されることはないので注意が必要です。

obj.js
function test() {
    var a = 100;
    return a;
}
var data = test();

test(); // 関数の実行
test; // 関数の参照

ちなみにオブジェクトとは値やキーと呼ばれるプロパティのデータを格納する入れ物です。関数はプログラムの処理を人まとめにした機能そのものなので仕組みとして共通している部分はいくつかありますね。

関数とオブジェクトは仲間です

関数オブジェクトに関してはMDNで詳しく解説されてます。

MDNでは関数は第一級オブジェクトであり、他のあらゆるオブジェクトと同じように操作したり渡したりする事ができるので関数とオブジェクトは仲間だと解説されてます。

第一級オブジェクトという言い方に少し違和感を感じる方がいるかと思いますが、要するに関数も「普通のオブジェクトと同じ」という解釈で大丈夫です。

つまり、関数とオブジェクトは仲間となります。勉強を進めるうえで「関数とオブジェクトは全然別物」と感じる人は多いかと思います。

関数とオブジェクトを区別するのではなく、「実は仲間だった」と心の片隅に刻んでもらいたかっただけなのです。

結局、関数オブジェクトとは何か?

画像

今回は関数オブジェクトについて解説しました。皆さんにお伝えしたかったことは「関数とオブジェクトを区別しよう」という話ではなく「関数とオブジェクトは仲間なんだ」と思ってもらいたかったのです。

関数オブジェクトは同じように変数に格納できますし、同じように扱えます。違いはオブジェクトを( )で実行しようとした時にわかります。

正直、完全に理解しようとしなくても大丈夫です。オブジェクトのプログラムを書いていくうちに自然と身につきますので焦らないんでください。