UGA Boxxx

つぶやきの延長のつもりで、知ったこと思ったこと書いてます

【JavaScript】関数オブジェクト

JavaScriptの関数オブジェクトのお話を聞く機会があり、理解していたつもりだが深くはできていなかったことに気づいた

なので、自分でももまとめてみる

tc39.es

関数の定義方法

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,
}