即時呼び出し関数は通常、プライベートで外部からアクセスできないローカル関数スコープを作成するために使用され、外部に影響を与えることなく独自のローカルシンボルを定義できます。多くの場合、これは良い習慣ですが、この特定のケースでは、何にも使用されていないため、数行のコード以外の利点が得られるとは思いません。
このコード:
(function(exports){
exports.notGlobalFunction = function() {
console.log('I am not global');
};
}(module));
次のような即時呼び出しがないコードと同じになります。
module.notGlobalFunction = function() {
console.log('I am not global');
};
異なる点の1つは、最初に、すぐに呼び出される関数ブロックに対してローカルであるmodules
calledのエイリアスが作成されることです。exports
ただし、エイリアスでは一意の処理は行われず、コードをmodules
直接使用することもできます。
変数modules
は、他の多くのグローバル変数をプロパティとして保持できる単一のグローバル親オブジェクトとして作成されます。これはしばしば「名前空間」と呼ばれます。これは、同じプロジェクト/ページで使用される他のコードと競合する可能性のあるトップレベルのグローバル変数の数を最小限に抑えるため、一般的に優れたデザインパターンです。
したがって、次のように複数のトップレベル変数を作成するのではなく、次のようにします。
var x, y, z;
次のような単一のトップレベル変数を作成できます。
var modules = {};
次に、他のすべてのグローバルをプロパティとしてアタッチします。
modules.x = 5;
modules.y = 10;
modules.z = 0;
このように、まだ複数のグローバル変数がありますが、他のコードと競合する可能性のあるトップレベルのグローバルは1つだけです。
同様に、即時呼び出し関数は、ローカルのプライベートスコープを作成します。このスコープでは、そのスコープに対してローカルであり、他のコードに干渉しない変数を作成できます。
(function() {
var x, y, z;
// variables x, y and z are available to any code inside this immediately invoked function
// and they act like global variables inside this function block and
// there values will persist for the lifetime of the program
// But, they are not truly global and will not interfere with any other global
// variables and cannot be accessed by code outside this block.
// They create both privacy and isolation, yet work just as well
})();
すぐに呼び出される関数に引数を渡すことは、それ自体のローカルシンボルを持つすぐに呼び出される関数のスコープに値を渡す方法にすぎません。
(function(exports) {
// creates a local symbol in this function block called exports
// that is assigned an initial value of module
})(module);