一部のJavaScriptコードについては、コードに表示されるか、時々人々がそれについて話します:
(function() {
var something;
function someFunction() {
// some code here
}
// do something
}());
それは "即時呼び出し関数式"、またはIIFE です。コードコメントで、「ええ、クロージャーでそれを行う」または「クロージャーでこれを行う」と人々が言うのをよく耳にします。
しかし、それは正しい概念ですか?ローカル変数がグローバルスコープにリークするのを防ぐのは、ローカルスコープまたは匿名ローカルスコープだと思います。これは、スコープチェーンを持つ関数であるクロージャとはまったく関係ありません。確かに、IIFEに使用される無名関数はクロージャですが、ここでは関係ありません。クロージャーが必要だと言うのは、現在のスコープ(およびスコープチェーン内のすべてのスコープ)へのアクセスが必要だからです。つまり、「クロージャーを使用して」ローカルスコープをグローバルスコープにシールドすることは、正しい概念ではありません。
更新:Cなど、クロージャーがない言語でも、ローカル変数をシールドしてグローバル空間にリークするのとまったく同じことを行うことができます。したがって、仕事をしているのは「閉鎖」ではありません。
ローカル変数がグローバルスコープにリークするのを防ぐのは、ローカルスコープまたは匿名ローカルスコープだと思います。
はい、それはまさにそれです。また、JavaScriptには実際にはブロックスコープがないため、JavaScriptを実装できる唯一の方法は関数を使用することです。したがって、IIFE。
関数式がクロージャーを作成するため、ここでクロージャーを使用していると言うのは本当です。それがないと、「ローカルスコープ」は、それが見つかったスコープ内の他の変数にアクセスできません。ただし、これも実装の詳細のようなものであり、設計レベルでの問題の中核ではありません。