web-dev-qa-db-ja.com

ES6コードをIIFEでラップする必要がありますか?

ES5では、そのようなコードを書くことは良い習慣と考えられてきました:

(function () {
    //some magic
})();

ただし、ES [6]では、letキーワードで作成された変数はwindowオブジェクトにアタッチされません。

それでは、IIFEでコードを記述する必要がありますか、それともまだ聞いたことのない目的がありますか?

20

モジュールを使用している場合、すべての変数のスコープはモジュールに限定されているため、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やブロックにラップする必要がなくなります。

4
Mike Cluck