ES5では、そのようなコードを書くことは良い習慣と考えられてきました:
(function () {
//some magic
})();
ただし、ES [6]では、let
キーワードで作成された変数はwindow
オブジェクトにアタッチされません。
それでは、IIFEでコードを記述する必要がありますか、それともまだ聞いたことのない目的がありますか?
モジュールを使用している場合、すべての変数のスコープはモジュールに限定されているため、IIFE(この「ラッパー」が呼び出される方法)を使用する必要はありません。
ただし、コードの一部を別の部分から分離したい場合もあり、その場合はIIFEを使用できます。
もちろん、let
またはconst
を使用している場合は、IIFEの代わりにブロックステートメントを使用できます。
{
let something = 1;
const somethingElse = 2;
}
console.log(something); // ReferenceError: something is not defined
Programmers.SEの関連質問を参照してください: JavaScriptでのカプセル化はどこまで実行する必要がありますか? 。
今ではそれほど問題ではありませんが、その一般的な考え方にはまだ理由があると私は主張します。
理論的には、たとえば、一部のサードパーティライブラリが次のようなコードを書くことが可能です。
let count = 0;
function getCount() {
return count++;
}
ここで、同じスコープ内に独自のcount
変数を作成しようとすると、エラーが発生します。
// 3rd-party
let count = 0;
function getCount() {
return count++;
}
// Your code
let count = 1;
ただし、IIFEの代わりに実際のブロックを使用して、コードをよりクリーンにすることができます。
// Still bad 3rd party
let count = 0;
function getCount() {
return count++;
}
// Your code
{
let count = 10;
console.log(count);
console.log(getCount());
console.log(count);
console.log(getCount());
}
将来的には、独自のスコープを持つモジュールにコードをカプセル化でき、コードをIIFEやブロックにラップする必要がなくなります。