macOS Mojave で Typescript ファイルの中身を Quick Look で見れるようにする
macOS では Quick Look と呼ばれる機能により、Finder でファイルを選択した状態でスペースキーを押すとファイルによっては中身が表示されます。ですが TypeScript ファイル(拡張子が .ts /...
add
という名前をもった変数に関数オブジェクトを格納しています。JavaScriptでは関数はオブジェクトなので、add
という変数は関数オブジェクトになるわけです。でもって関数オブジェクトを引数にしてconsole.log
でオブジェクトの中身を表示させています。
次にadd=0
で変数を数値として上書きしています。この時点でadd
という変数には0という数値が代入されて関数オブジェクトではなくなります。なのでconsole.log(add)
では”0″が出力されますが、console.log(add(4,5))
ではエラーが出ます。add
はもはや関数オブジェクトではないからです。
なので
あるプログラミング言語において、たとえば生成、代入、演算、(引数・戻り値としての)受け渡しといったその言語における基本的な操作を制限なしに使用できる対象のことである 第一級オブジェクト – Wikipediaらしいです。でもって第一級オブジェクトは
無名のリテラルとして表現可能である。 変数に格納可能である。 データ構造に格納可能である。 それ自体が独自に存在できる(名前とは独立している)。 他のものとの等値性の比較が可能である。 プロシージャや関数のパラメータとして渡すことができる。 プロシージャや関数の戻り値として返すことができる。 実行時に構築可能である。 表示可能である。 読み込むことができる。 分散したプロセス間で転送することができる。 実行中のプロセスの外に保存することができる。 第一級オブジェクト – Wikipediaというような性質をもっているようです。さっきのaddの例でいえば、『変数に格納可能である』というのがまさに当てはまっています。 ということで改めて:”JavaScriptでの関数はオブジェクトである” まぁ全部が全部こうではないです。唯一の例外がクロージャーと呼ばれる関数です。クロージャーについては後述します。
function()...
でもって名前のない関数を定義した上でそれをhogeFuncという名前の変数に代入しています。hogeFuncという変数に代入されるのは関数リテラルへの参照です。以下のように配列リテラル['a','b','c','d']
を変数hogeに格納して配列にしているのと同じようなものです;
コンピュータプログラミングにおいてリテラルは、ソースコード内に値を直接表記したものをいう。数値、文字列、関数などさまざまな型のものが存在し、それぞれの表記方法も言語によって異なる。即値ともいう。 リテラル – Wikipediaだそうです。 JavaScriptでクラスのようなものを作ろうとしたら、この無名関数をコンストラクタ関数として使ったりします。この場合は、『関数リテラルの構文で関数オブジェクトを生成してhogeFuncという名前の変数に参照代入している』という感じに捉えることができます。詳しくはJavaScriptでのオブジェクト指向プログラミングを読んでください。
{ hoge: fuctioon () {...} ... }
という無名オブジェクトを生成してhogeFuncという変数に代入している、と考えた方がしっくりくるかもしれません。これもJavaScriptでのオブジェクト指向プログラミングを読んでみてください。おそらくそっちを読んでから見ると印象がだいぶ変わると思います。
hoge=0
のところで変数hogeに0という数値が代入されてもともとの function(num) {...}
とは関係なくなってしまうので、最後の var hoge2 = hoge(10);
ではエラーが出る、というのが理解できるんじゃないでしょうか。また変数hoge1には次の行の hoge = 0
とは関係なくクロージャーがセットされているので、console.log(hoge1())
はエラーにならずに”2″が表示されます。
function hoge() {...}
と書くと分かりにくいかもしれませんが、やっているのは変数hogeへの関数オブジェクトの代入です。JavaScriptでの関数名というのはその関数オブジェクトを代入するための変数であると考えてください。var hoge = function() {...}
の形だとそれがより分かりやすいと思います。