クロージャーという言葉が指すのは関数自体かそれとも仕組みか

投稿者: Anonymous

クロージャに関して読んでいると宣言時の関数外部の変数状態も保存できる仕組みそのものを指している時もあれば、

function outer(){
    var x = 1;
    return function (){
    x = x + 1;
    };
}

の無名関数部分をクロージャと呼んだりしてる所もあるようなのですが、どちらが正しいのでしょうか?

恐らく仕組みそのものを指す用語であって、関数の種類の一つとしてクロージャという名前が使われてるのは誤用だと思うのですが合っているでしょうか?

解決

意見がわかれそうな内容ではありますと前置きをしておきます。

私の認識は、クロージャは仕組みそのものであって、無名関数とは分けて考えたほうがよいと思っています。

とはいえ、PHPのマニュアルのように、

http://php.net/manual/ja/functions.anonymous.php

無名関数はクロージャとも呼ばれ、 関数名を指定せずに関数を作成できるようにするものです。

というように、無名関数 = クロージャ としている例も(言語も)見かけます。

ここで、PHPの無名関数について、もっとよく見てみると
外の変数を参照するには以下のことをしろと書いています。

クロージャは、変数を親のスコープから引き継ぐことができます。 引き継ぐ変数は、use で渡さなければなりません。

つまりJavaScriptでは何も意識しないでも外部の変数を参照できたのに対し、PHPではuseによって明示的に指定する必要があるのです。

PHPでは外部の値を参照する(この外部の値を参照できるのが、私の考えるクロージャの部分です)ためにはわざわざ別のuseという予約語を用意していることからも、無名関数とクロージャは別として考えたほうがわかりやすいというのが私の見解です。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *