質問

私は勉強 YUI と時折このイディオムを見てきました。

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

なぜ彼らはそれを呼び出すための関数を作成するのですか? 理由だけで書かないで:

<script>
    do abcxyz
</script>

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

役に立ちましたか?

解決

これは閉鎖するを活用しています。

短い説明:JSは、関数レベルのスコープを使用しているので、あなたが関数内でのアクションの束を行うと、それはそのスコープ内に残ることができます。これは、グローバル名前空間と混乱しないコードを呼び出すために有用です。また、1のプライベート変数を行うことができます - あなたは匿名関数の内部で変数を宣言して、すぐにそれを実行した場合、匿名関数の内部でのみ、他のコードは、その変数にアクセスすることができます。

たとえば、私はグローバルな一意のIDジェネレータを作成するとします。一つは、このようなコードを実行します。

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

しかし、今、誰もが混乱して、のカウンターのことができます、と私は今、二つの変数(のカウンターられたGenID の)とのグローバルな名前空間を汚染しましたます。

その代わり、私は私のカウンタ機能を生成するために無名関数を使用することができます:

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

    return genIdImpl;
}();

今、私が唯一有利であるグローバル名前空間では、1つの変数を持っています。より重要なことに、カウンタ変数は、現在変更されてから安全である - それは、匿名関数のスコープ内に存在し、(同じ範囲で定義された)のでのみ機能genIdImplはそれにアクセスすることができる

これは、YUIのコード例のように見えますが、彼らはただのすべてのグローバル名前空間を汚染しないコードを実行します。

他のヒント

彼らは私が推測するだろう、名前空間の衝突を避けるためにします。 JSで良いプラクティスとしてそうです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top