16

私はYUIを学んでいて、時々このイディオムを見てきました。

 <script>
     (function x(){ do abcxyz})();
 </script>

なぜ彼らはそれを呼び出すためだけに関数を作成するのですか?なぜ書いてみませんか:

<script>
    do abcxyz
</script>

たとえば、ここを参照してください。

4

2 に答える 2

45

彼らはクロージャを利用しています。

簡単な説明:JSは関数レベルのスコープを使用するため、関数内で一連のアクションを実行し、そのスコープ内にとどめることができます。これは、グローバル名前空間を混乱させないコードを呼び出す場合に役立ちます。また、プライベート変数を作成することもできます。無名関数内で変数を宣言してすぐに実行すると、無名関数内の他のコードのみがその変数にアクセスできます。

たとえば、グローバル一意IDジェネレーターを作成するとします。次のようなコードを実行する場合があります。

var counter = 0;
var genId = function()
{
    counter = counter + 1;
    return counter;
}

ただし、今では誰でもcounterをいじることができ、2つの変数(countergenId)でグローバル名前空間を汚染しました。

代わりに、無名関数を使用してカウンター関数を生成できます。

var genId = function()
{
    var counter = 0;
    var genIdImpl = function()
    {
        counter = counter + 1;
        return counter;
    }

    return genIdImpl;
}();

現在、グローバル名前空間には変数が1つしかないため、有利です。さらに重要なことに、カウンター変数は変更されないようになりました。無名関数のスコープにのみ存在するため、同じスコープで定義された関数genIdImplのみがアクセスできます。

YUIのサンプルコードでは、グローバル名前空間をまったく汚染しないコードを実行したいだけのようです。

于 2009-03-30T18:53:54.693 に答える
3

彼らは名前空間の衝突を避けたいと思っていると思います。JSの良い習慣のようです。

于 2009-03-30T18:56:47.277 に答える