JavaScript の関数は値です。つまり、関数はオブジェクトによって表され、他のオブジェクトと同様に、変数の値になったり、式に参加したりできます。
したがって
(function() { ... })
値です。17
または"hello world"
値です。
関数が (値として) 式に表示され、その後(...)
に括弧内にコンマ区切りの式のリストが続く場合、それは関数呼び出しです。
では、次のようにします。
(function() { ... })()
関数を (値として) 作成し、その関数を引数なしで呼び出します。関数オブジェクトは、少なくともそのコードの直接の結果として、どこにも保存されません。関数呼び出しが完了すると本質的に消え、その部分式の全体的な値は関数が返したものになります。
このような関数にパラメーターを渡すことは、他の関数にパラメーターを渡すことと同じです。あなたが引用した特定の例では、目的は、誤った「エイリアン」コードによって引き起こされる特定の種類の異常を防ぐことです。あなたの例は本当に読むべきです:
(function(window, undefined) {
// code
})(this);
シンボルthis
は予約語であり、その値はランタイムによって完全に制御されます。(まあ、ローカル実行コンテキストの値はこのように制御されます。) グローバル スコープで評価されると、上記のコードは無名関数内でシンボル "window" がグローバル コンテキストへの参照になることを保証します。この種の構造は、グローバル コンテキストが「ウィンドウ」と呼ばれない Node.js など、ブラウザ以外のコンテキストで使用される可能性のあるコードにも役立ちます。