web-dev-qa-db-ja.com

JavaScript IIFEは、クロージャとしてグローバルスペースへのリークを防ぎますか?それは正しいコンセプトですか?

一部のJavaScriptコードについては、コードに表示されるか、時々人々がそれについて話します:

(function() {
    var something;

    function someFunction() { 
        // some code here
    }

    // do something

}());

それは "即時呼び出し関数式"、またはIIFE です。コードコメントで、「ええ、クロージャーでそれを行う」または「クロージャーでこれを行う」と人々が言うのをよく耳にします。

しかし、それは正しい概念ですか?ローカル変数がグローバルスコープにリークするのを防ぐのは、ローカルスコープまたは匿名ローカルスコープだと思います。これは、スコープチェーンを持つ関数であるクロージャとはまったく関係ありません。確かに、IIFEに使用される無名関数はクロージャですが、ここでは関係ありません。クロージャーが必要だと言うのは、現在のスコープ(およびスコープチェーン内のすべてのスコープ)へのアクセスが必要だからです。つまり、「クロージャーを使用して」ローカルスコープをグローバルスコープにシールドすることは、正しい概念ではありません。

更新:Cなど、クロージャーがない言語でも、ローカル変数をシールドしてグローバル空間にリークするのとまったく同じことを行うことができます。したがって、仕事をしているのは「閉鎖」ではありません。

4
nonopolarity

ローカル変数がグローバルスコープにリークするのを防ぐのは、ローカルスコープまたは匿名ローカルスコープだと思います。

はい、それはまさにそれです。また、JavaScriptには実際にはブロックスコープがないため、JavaScriptを実装できる唯一の方法は関数を使用することです。したがって、IIFE。

関数式がクロージャーを作成するため、ここでクロージャーを使用していると言うのは本当です。それがないと、「ローカルスコープ」は、それが見つかったスコープ内の他の変数にアクセスできません。ただし、これも実装の詳細のようなものであり、設計レベルでの問題の中核ではありません。