質問: x + 1; }; } ``` の無名関数部分をクロージャと呼んだりしてる所もあるようなのですが、どちらが正しいのでしょうか? 恐らく仕組みそのものを指す用語であって、関数の種類の一つとしてクロージャという名前が使われてるのは誤用だと思うのですが合っているでしょうか?
回答: 言語仕様においては用語として*closure*が定義されているわけではありませんので、世界中の人が同意する「正しい」答えはありません。ただし、この言語仕様には各所でclosureの単語が出現します。たとえば: > > 14.1.21 Runtime Semantics: Evaluation > > > ... > > *FunctionExpression: function (FormalParameters) { FunctionBody }* > > ... > > 3. Let ***closure*** be FunctionCreate(Normal, FormalParameters, FunctionBody, scope, strict). > > 4. Perform MakeConstructor(***closure***). > > 5. Return ***closure***. > > > これは関数定義の言語仕様的な表現ですが、生成される関数オブジェクトを代入する内部的な変数の名前として ***closure*** を用いています。この事実を採用するならば、言語仕様に書いてあるclosureとは関数functionのシノニムです。 あるいは、MDNにおいては次のような説明があります: > > Closures - JavaScript | MDN > > > A *closure* is ***the combination*** of a function and the lexical environment within which that function was declared. > > > この定義に従えば、クロージャとは ***関数(オブジェクト)と、その関数が定義されたスコープの組み合わせ*** です。こちらのほうがたしかに精密に言及している気がします。 ではご指摘の件はどうかというと、私は文脈によって使い分けてもいいのではないかと思います。 私自身は言語仕様的な用法、つまり`function===closure`で使っています(笑)。 ただ、「関数の種類の一つとしてクロージャという名前が使われてる」のは微妙ですね。クロージャである(として定義された)関数とそうでない関数を見分ける方法がない(`isClosure(f: Function): boolean`みたいなのが作れない)のがその根拠です。