私はYUIを学んでいて、時々このイディオムを見てきました。
<script>
(function x(){ do abcxyz})();
</script>
なぜ彼らはそれを呼び出すためだけに関数を作成するのですか?なぜ書いてみませんか:
<script>
do abcxyz
</script>
たとえば、ここを参照してください。
彼らはクロージャを利用しています。
簡単な説明:JSは関数レベルのスコープを使用するため、関数内で一連のアクションを実行し、そのスコープ内にとどめることができます。これは、グローバル名前空間を混乱させないコードを呼び出す場合に役立ちます。また、プライベート変数を作成することもできます。無名関数内で変数を宣言してすぐに実行すると、無名関数内の他のコードのみがその変数にアクセスできます。
たとえば、グローバル一意IDジェネレーターを作成するとします。次のようなコードを実行する場合があります。
var counter = 0;
var genId = function()
{
counter = counter + 1;
return counter;
}
ただし、今では誰でもcounterをいじることができ、2つの変数(counterとgenId)でグローバル名前空間を汚染しました。
代わりに、無名関数を使用してカウンター関数を生成できます。
var genId = function()
{
var counter = 0;
var genIdImpl = function()
{
counter = counter + 1;
return counter;
}
return genIdImpl;
}();
現在、グローバル名前空間には変数が1つしかないため、有利です。さらに重要なことに、カウンター変数は変更されないようになりました。無名関数のスコープにのみ存在するため、同じスコープで定義された関数genIdImplのみがアクセスできます。
YUIのサンプルコードでは、グローバル名前空間をまったく汚染しないコードを実行したいだけのようです。
彼らは名前空間の衝突を避けたいと思っていると思います。JSの良い習慣のようです。