JavaScriptの関数オブジェクトのお話を聞く機会があり、理解していたつもりだが深くはできていなかったことに気づいた
なので、自分でももまとめてみる
関数の定義方法
function add(x, y) { return x + y; } const add = function(x, y) { return x + y; } const add = (x, y) => x + y;
重要なことは関数定義は「実行前に既に終わっている」ということ
構文エラーは実行前に検出される
関数オブジェクト
関数定義は実行前に終わっているが、オブジェクトの生成は実行時に行われる
そして、生成毎に違うオブジェクトになる(オブジェクトの一意性)
function f() { function g() { } return g } const g1 = f() const g2 = f() g1 === g2 // false
関数は以下のプロパティ(length, name)を持つので
> function add (x, y) { return x + y} < undefined > Object.getOwnPropertyNames(add) < ["length", "name"]
実行するたびに以下のようなオブジェクトが生成されるイメージをもっておくとよさそう(ただのオブジェクトではない)
const add = { name: 'add', length: 2, }